home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / DB_CLIPP / H190.ZIP / VERTEX1.EXE / MANUAL < prev    next >
Text File  |  1992-09-06  |  204KB  |  5,106 lines

  1.  
  2.    VVV        VVV  EEEEEEEEE  RRRRRR     TTTTTTTTT  EEEEEEEEE  XXX    XXX
  3.    VVV        VVV  EEEEEEEEE  RRRRRRRR   TTTTTTTTT  EEEEEEEEE  XXX    XXX
  4.    VVV        VVV  EEE        RRR   RRR     TTT     EEE         XXX  XXX
  5.    VVV        VVV  EEE        RRR   RRR     TTT     EEE          XXXXXX
  6.    VVV        VVV  EEEEEE     RRR  RRR      TTT     EEEEEE        XXXX
  7.     VVV      VVV   EEEEEE     RRRRRR        TTT     EEEEEE        XXXX
  8.      VVV    VVV    EEE        RRR RRR       TTT     EEE          XXXXXX
  9.       VVV  VVV     EEE        RRR  RRR      TTT     EEE         XXX  XXX
  10.        VVVVVV      EEEEEEEEE  RRR   RRR     TTT     EEEEEEEEE  XXX    XXX
  11.         VVVV       EEEEEEEEE  RRR   RRR     TTT     EEEEEEEEE  XXX    XXX
  12.  
  13.                            000000           9999999
  14.                           00000000         999999999
  15.                          000    000       999     999
  16.                          000    000       99999999999
  17.                          000    000         999999999
  18.                          000    000               999
  19.                          000    000       99      999
  20.                           00000000    ,,, 999    999
  21.                            000000     ,,,   9999999
  22.                                        ,
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.                              Table of Contents
  30.      Subject                                                        Page
  31.      ___________________________________________________________________
  32.  
  33.      General Information.........................................    2
  34.  
  35.      Important Information.......................................    2
  36.             Overview.............................................    2
  37.             Parameters...........................................    2
  38.             Returnvalues.........................................    2
  39.             Examples.............................................    2
  40.             META Functions.......................................    2
  41.             Calling conventions..................................    2
  42.  
  43.      Copyright Information.......................................    2
  44.  
  45.             Concept..............................................    2
  46.  
  47.      Blinker Link Script and Information.........................    2
  48.  
  49.      Functions    ...............................................    2
  50.  
  51.             Array functions......................................    2
  52.  
  53.                   ArBigArrElem().................................    2
  54.                   ArBldArr().....................................    2
  55.                   ARCOUNT()......................................    2
  56.                   AREVENOUT()....................................    2
  57.                   ARMAX()........................................    2
  58.                   ARMAXPOS().....................................    2
  59.                   ARMIN()........................................    2
  60.                   ARMINPOS().....................................    2
  61.                   ARSHRINKARRAY()................................    2
  62.                   ARSMLARRELEM().................................    2
  63.                   ARSUM()........................................    2
  64.  
  65.             Box functions........................................    2
  66.  
  67.                   BXBOX()........................................    2
  68.                   BXMAKEBOX()....................................    2
  69.                   BXPUSHBUTTON().................................    2
  70.                   BXSCROLL().....................................    2
  71.                   BXUNBOX()......................................    2
  72.  
  73.             Database functions...................................    2
  74.  
  75.                   DBBIGFIELD()...................................    2
  76.                   DBCONWORD()....................................    2
  77.                   DBDELREC().....................................    2
  78.                   DBEXPDATA()....................................    2
  79.                   DBFLDEXIST()...................................    2
  80.                   DBFLDSUM().....................................    2
  81.                   DBIMPDATA()....................................    2
  82.                   DBINUSE()......................................    2
  83.                   DBISDBF()......................................    2
  84.                   DBISMEMO().....................................    2
  85.                   DBJUMP().......................................    2
  86.  
  87.                        Table of Contents Continued...
  88.  
  89.      Subject                                                        Page
  90.      ___________________________________________________________________
  91.  
  92.      Functions continued...
  93.  
  94.             Database Functions continued...
  95.  
  96.                   DBLOOKFOR()....................................    3
  97.                   DBSELDBVAL()...................................    3
  98.                   DBSHRINKFILE().................................    3
  99.                   DBTBLVIEW()....................................    3
  100.                   DBZAPDB()......................................    3
  101.  
  102.             Date functions.......................................    3
  103.  
  104.                   DTBEGEND().....................................    3
  105.                   DTBOM()........................................    3
  106.                   DTBOY()........................................    3
  107.                   DTCHKDTEFMT()..................................    3
  108.                   DTDATEADD()....................................    3
  109.                   DTDAYSIN().....................................    3
  110.                   DTDIFF().......................................    3
  111.                   DTDINM().......................................    3
  112.                   DTDOY()........................................    3
  113.                   DTDTOF().......................................    3
  114.                   DTDTOW().......................................    3
  115.                   DTSETDATE()....................................    3
  116.                   DTWOY()........................................    3
  117.  
  118.             File functions.......................................    3
  119.  
  120.                   FIASKFILENAME()................................    3
  121.                   FIBLDDBF().....................................    3
  122.                   FIINFO().......................................    3
  123.                   FIKEEPVAR()....................................    3
  124.                   FIMAKEUNIQUE().................................    3
  125.                   FITEMPCLEAN()..................................    3
  126.                   FIVARGET().....................................    3
  127.  
  128.             Graphics functions...................................    3
  129.  
  130.                   GRBOX()........................................    3
  131.                   GRINIT().......................................    3
  132.                   GRLINE().......................................    3
  133.                   GRPTREAD().....................................    3
  134.                   GRPTWRITE()....................................    3
  135.  
  136.             META functions.......................................    3
  137.  
  138.                   MFCOLORPICK()..................................    3
  139.                   MFDATAENTRY()..................................    3
  140.                   MFDBTOOLS()....................................    3
  141.                   MFMAKEEXPR()...................................    3
  142.                   MFPICKCOLOR()..................................    3
  143.                   MFSELFILE()....................................    3
  144.                   MFSETCOLOR()...................................    3
  145.  
  146.  
  147.                             Table of Contents Continued...
  148.      Subject                                                        Page
  149.      ___________________________________________________________________
  150.  
  151.      Functions continued...
  152.  
  153.             Menu functions.......................................    4
  154.  
  155.                   MNABORT()......................................    4
  156.                   MNALERT()......................................    4
  157.                   MNCHOICE().....................................    4
  158.                   MNFIELDS().....................................    4
  159.                   MNINFO().......................................    4
  160.                   MNMENU().......................................    4
  161.                   MNMESSYN().....................................    4
  162.                   MNMSG()........................................    4
  163.                   MNPULLDN().....................................    4
  164.                   MNTAKEFIELD()..................................    4
  165.  
  166.             Math functions.......................................    4
  167.  
  168.                   MTARAVERAGE()..................................    4
  169.                   MTARSUM()......................................    4
  170.                   MTDBAVERAGE()..................................    4
  171.                   MTDBFLDSUM()...................................    4
  172.                   MTDEC2HEX()....................................    4
  173.                   MTHEX2DEC()....................................    4
  174.  
  175.             Index functions......................................    4
  176.  
  177.                   NXDBSEEK().....................................    4
  178.                   NXINDEXKEY()...................................    4
  179.                   NXISVALID()....................................    4
  180.                   NXSCAN().......................................    4
  181.                   NXSELECT().....................................    4
  182.  
  183.             Print functions......................................    4
  184.  
  185.                   PROUTPUT().....................................    4
  186.  
  187.             String functions.....................................    4
  188.  
  189.                   STARRANGE()....................................    4
  190.                   STBEGINSWITH().................................    4
  191.                   STCENTER().....................................    4
  192.                   STCHRINSTR()...................................    4
  193.                   STCRUNCH().....................................    4
  194.                   STCUTLEFT()....................................    4
  195.                   STCUTRIGHT()...................................    4
  196.                   STENDSWITH()...................................    4
  197.                   STLPAD().......................................    4
  198.                   STLSHIFT().....................................    4
  199.                   STRPAD().......................................    4
  200.                   STRSHIFT().....................................    4
  201.  
  202.  
  203.                        Table of Contents Continued...
  204.      Subject                                                        Page
  205.      ___________________________________________________________________
  206.  
  207.      Functions continued...
  208.  
  209.             System functions.....................................    5
  210.  
  211.             SYCHDIR()............................................    5
  212.             SYCHDRIVE()..........................................    5
  213.             SYCOLDBOOT().........................................    5
  214.             SYCURDRV()...........................................    5
  215.             SYDRIVE()............................................    5
  216.             SYDRIVES()...........................................    5
  217.             SYDRVEFREE().........................................    5
  218.             SYDRVETTL()..........................................    5
  219.             SYDRVROK()...........................................    5
  220.             SYDRVWOK()...........................................    5
  221.             SYMKDIR()............................................    5
  222.             SYRMDIR()............................................    5
  223.  
  224.             Other functions......................................    5
  225.  
  226.             UTBELLATTN().........................................    5
  227.             UTBELLDONE().........................................    5
  228.             UTBELLERROR()........................................    5
  229.             UTBELLUDF()..........................................    5
  230.             UTBITSET()...........................................    5
  231.             UTBYTEAND()..........................................    5
  232.             UTBYTEOR()...........................................    5
  233.             UTCHKCURSTYPE()......................................    5
  234.             UTCOLCONVERT().......................................    5
  235.             UTCTRLW()............................................    5
  236.             UTDRIVES()...........................................    5
  237.             UTEDPIC()............................................    5
  238.             UTENHANCED().........................................    5
  239.             UTERRFUNCTION()......................................    5
  240.             UTEXPRISTRUE().......................................    5
  241.             UTGETCURSTYPE()......................................    5
  242.             UTINIT().............................................    5
  243.             UTISBIT()............................................    5
  244.             UTKEEPVAR()..........................................    5
  245.             UTPROFILE()..........................................    5
  246.             UTSAVEKEY()..........................................    5
  247.             UTSTANDARD().........................................    5
  248.             UTUNSELECTED().......................................    5
  249.  
  250.  
  251.  
  252.                        Table of Contents Continued...
  253.      Subject                                                        Page
  254.      ___________________________________________________________________
  255.  
  256.      Functions continued...
  257.  
  258.             Video functions......................................    6
  259.  
  260.                   VIATT()........................................    6
  261.                   VICLS()........................................    6
  262.                   VICOLGRID()....................................    6
  263.                   VIFADE().......................................    6
  264.                   VIGETMODE()....................................    6
  265.                   VIISCGA()......................................    6
  266.                   VIISEGA()......................................    6
  267.                   VIISHERC().....................................    6
  268.                   VIISMCGA().....................................    6
  269.                   VIISMDA()......................................    6
  270.                   VIISVGA()......................................    6
  271.                   VIPRNT().......................................    6
  272.                   VISETMODE()....................................    6
  273.                   VISLIDEOFF()...................................    6
  274.  
  275.  
  276.                             GENERAL INFORMATION
  277.  
  278.      IMPORTANT:
  279.      ----------
  280.      If You want to use ANY of the VERTEX Library functions, make sure
  281.      You have called first of all the UTINIT() function to initialize
  282.      important global variables. Not doing so may result in
  283.      crashing Your program at any time.
  284.  
  285.      If You use BLINKER have a look first of all at the sample LINK
  286.      script provided. It explains in some details what You have to
  287.      look for in properly linking the lot.
  288.  
  289.      Since quite some functions are written in C or Assembler it is
  290.      necessary to put the CCALL object into the ROOT should You decide
  291.      to OVERLAY the Library. It also speeds up the program.
  292.  
  293.                             C functions are marked with Ω
  294.                             Assembler functions are marked Σ
  295.                             CLIPPER functions are not marked
  296.  
  297.      Overview:
  298.      ---------
  299.      All functions listet are written in CLIPPER 5.01 and compiled with
  300.      the latest CLIPPER compiler unless otherwise stated. Some CLIPPER
  301.      functions call C- or Assembler functions. The functions are
  302.      called with or without parameters as required.
  303.  
  304.      Parameters:
  305.      -----------
  306.      To identify the type of parameters they are classed in different
  307.      expressions of which the following list applies:
  308.  
  309.      <expCn> an expression made up of any valid characters
  310.  
  311.      <expLn> an expression of a logical value either .T. or .F.
  312.  
  313.      <expNn> an expression of a number being of type either FLOAT or
  314.              INTEGER
  315.  
  316.      <expAn> an expression of an array of any type
  317.  
  318.      <expDn> an expression of a date
  319.  
  320.      <expOn> an expression of an object
  321.  
  322.      where in all cases the lower case "n" identifies the n-th number
  323.      of the relevant expression passed.
  324.  
  325.      All parameter Idenifyers are enclosed in brackets. They may be <>,
  326.      [] or () and can appear on their own or combined with each other.
  327.      These symbols mean:
  328.  
  329.      ( ... )   PARAMETER LIST
  330.      < ... >   MUST be passed
  331.      [< ... >] OPTIONAL, does not need to be passed
  332.  
  333.      The parameters my be divided by means of a comma (,) or a vertical
  334.      line (|) which mean:
  335.  
  336.      ,  seperator of parameter, next to follow
  337.  
  338.      |  seperator of two or more possible parameters
  339.  
  340.      Returnvalues:
  341.      -------------
  342.      All functions returns something unless clearly identified as
  343.      returning NIL or nothing.
  344.  
  345.      Examples:
  346.      ---------
  347.      As far as I could, I included some examples with each function
  348.      description. They should give You some idea as to what You
  349.      could/should do with them and how to call them.
  350.  
  351.      META functions:
  352.      ---------------
  353.      Several times, the term META functions is being used within
  354.      this Library. A META function is a complete data processing- and
  355.      manipulation function made up of several other functions of this
  356.      Library, ready to be used and to be linked into programs. The use
  357.      of these META functions enables one to create very quickly
  358.      complex programs without the need for long development times
  359.  
  360.      Calling conventions:
  361.      --------------------
  362.      All functions have a 2 character prefix identifying the group into
  363.      which the function falls:
  364.  
  365.      Prefix               Group
  366.      __________________________________________________
  367.  
  368.      AR               Array manipulation- and creation
  369.      BX               Box manipulation- and creation
  370.      DB               Data manipulation- and creation
  371.      DT               Date manipulation
  372.      FI               File modifications
  373.      GR               Graphics functions
  374.      MF               General VERTEX META functions
  375.      MN               Menus and Dialog-boxes popup
  376.      MT               Math Functions
  377.      NX               Index manipulation
  378.      PR               Printer functions
  379.      ST               String manipulation
  380.      SY               low level System functions
  381.      UT               General Utilities
  382.      VI               General Video functions
  383.      XX               internal VERTEX Library functions
  384.  
  385.      IMPORTANT:      Do not use the functions prefexed XX.....
  386.                      directly. They are powerfull C- and
  387.                      Assemblerfunctions and should ONLY be called by
  388.                      VERTEX functions.
  389.  
  390.  
  391.                     IMPORTANT COPYRIGHT INFORMATION
  392.                     ----------------------------------
  393.  
  394.      This Library VERTEX is Copyright (c) 1991-92 by the Author W.A.
  395.      Steinert, as well as all other accompanying documents and sample
  396.      programs unless explicitly stated otherwise.
  397.  
  398.      Following concept applies to this package:
  399.  
  400.      1.     You may use, copy and distribute this package freely
  401.             however You may NOT remove the Copyright Notice at the
  402.             beginning of the program. You MUST mention the use of this
  403.             Library in Your program and the associated documents.
  404.  
  405.      2.     You are encouraged to register this LIBRARY by sending a
  406.             letter stating this wish to the author at following
  407.             address:
  408.  
  409.                             W.A. Steinert VERTEX Enterprises
  410.                             27 Dahlemstr.
  411.                             8750 Aschaffenburg
  412.                             West Germany
  413.  
  414.      3.     There is a small registration fee charged to private
  415.             users for this VERTEX-Library, currently
  416.             US $ 49.00. The user will receive a LIBRARY registered to
  417.             him which will NOT include the COPYRIGHT notice at the
  418.             beginning.
  419.  
  420.      4.     The author will inform registered users about any updates
  421.             to the LIBRARY and will give them the opportunity to update
  422.             for a fee of US $ 10.00, covering the mailing and
  423.             packaging. Updates will be released about twice annually.
  424.             This policy is valid for PRIVATE USERS only. The first
  425.             update is free of charge for registered users.
  426.  
  427.      5.     Private, registerd users may order from the author for a
  428.             fee of US $ 10.00 ( mailing and packaging ), a registered
  429.             copy of the LIBRARY in following languages:
  430.  
  431.  
  432.             FRENCH (released by 01/93 )
  433.             GERMAN
  434.             ENGLISH
  435.             ITALIAN ( released by 01/93 )
  436.  
  437.      6.     Commercial users, Government offices and Companies must
  438.             register the LIBRARY prior usage however they are granted
  439.             the right to use the LIBRARY for not more than 60 days free
  440.             of charge from the moment of receival of that LIBRARY. Any
  441.             further usage of programs which have been compiled using
  442.             this LIBRARY or the LIBRARY itself may continue only after
  443.             registration of the VERTEX LIBRARY. The registration fee
  444.             for NON-PRIVATE users is US $ 79.00.
  445.      7.     NON-PRIVATE, NON-PROFIT Organisations are encouraged to
  446.             register their LIBRARY with the author as they will receive
  447.             a registered LIBRARY free of charge. They may use this
  448.             Library ONLY for usage associated directly with the
  449.             organisation.
  450.  
  451.      8.     Programs compile by using a NON-REGISTERED VERTEX Library
  452.             may be sold without royalties however they MUST contain the
  453.             Copyright Notice UNLESS these programs have been compiled
  454.             by using a REGISTERED COPY OF THE VERTEX LIBRARY.
  455.  
  456.  
  457.      9.     The author shall not be liable for any direct, indirect,
  458.             incidental or consequential damages resulting or seemingly
  459.             result from the use, test or distribution of the Library
  460.             and/or the accompanying programs.
  461.  
  462.      10.    The use of this Library constitutes agreement to the
  463.             preceeding points as well as to the proposition that by
  464.             such You become bound to the terms of this agreement.
  465.  
  466.         CLIPPER is a Trademark of NANTUCKET Corporation and Computer
  467.                        Associates International Inc.
  468.  
  469.               Turbo Assembler is a copyright by BORLAND INTL.
  470.  
  471.                Microsoft C is a copyright by MICROSOFT Corp.
  472.  
  473.  
  474.                        SAMPLE BLINKER LINK SCRIPT
  475.                        --------------------------
  476.      #
  477.      # Blinker 1.50 Sample Link file for Clipper 5.01 using VERTEX
  478.      # Library
  479.      #
  480.      # This sample script is intended to be used as a template for your
  481.      # own scripts
  482.      #
  483.      # This script is set up a a development script, that enables
  484.      # incremental linking, and overlays EXTEND.LIB from the Nantucket
  485.      # libraries. When incremental linking is enabled, applications
  486.      # will use somewhat more memory than normal, due to a certain
  487.      # amount of 'padding' being left at the end of each Clipper
  488.      # procedure, but this is offset by the extremely fast incremental
  489.      # link times.
  490.      #
  491.      # Before shipping a completed application, you should disable the
  492.      # incremental linking feature, which will save memory, and increase
  493.      # execution speed by:
  494.      #
  495.      #   a) Enabling the 5.01 Clipper paging system
  496.      #   b) Remove the padding between procedures
  497.      #   c) Turning on symbol table compression
  498.      #
  499.      # For final links - UN-COMMENT the following command:
  500.      #
  501.      #BLINKER INCREMENTAL OFF
  502.      #DEBUG
  503.      #
  504.      # If You have troubles with Your application after linking it with
  505.      # Blinker (i.e. termiates with Memory faults ) try increasing the
  506.      # OPSIZE....
  507.      #
  508.      # Burn in your own Clipper variables here eg: F25;SWAPPATHC:\;
  509.      #
  510.  
  511.      BLINKER EXECUTABLE CLIPPER F25;E1024;X64;BADCACHE;
  512.  
  513.      #
  514.      # Specify the EXE filename here:
  515.      #
  516.  
  517.      OUTPUT MYFILE
  518.  
  519.      #
  520.      # List your Clipper S'87 object modules here. The first FILE
  521.      # mentioned in any Blinker link script MUST be a Clipper code
  522.      # module. The first module may be overlaid if required.
  523.      #
  524.      FILE MYTEST
  525.  
  526.      #
  527.      # Uncomment if You want to use the profiler. Call the function
  528.      # UTPROFILE() as second function ( right after UTINIT() ) and run
  529.      # Your programming in profiling mode to find out where to put Your
  530.      # Modules.
  531.      #
  532.      MODULE UTINIT
  533.      #MODULE UTPROFIL
  534.      #
  535.      # Uncomment the next lot to increase output speed of anything which
  536.      # has to do with GETS or Buttons.
  537.      #
  538.      #MODULE UTEDPIC
  539.      #
  540.      # clippers own global maxcol and maxrow function.....
  541.      MODULE __GTMAXCOL
  542.      MODULE __GTMAXROW
  543.  
  544.  
  545.      #MODULE __ATPROMPT
  546.      #MODULE BXMAKEBOX
  547.      #MODULE EXITSTATE
  548.      #MODULE READVAR
  549.      #MODULE SUBSCRIPT
  550.      #MODULE _EXITSTATE
  551.      #MODULE GETACTIVE
  552.      #MODULE SETTLE
  553.      #MODULE AFILL
  554.      #MODULE BXBUTTON
  555.      #
  556.      # Uncomment and list your 3rd party non overlayable object modules
  557.      # here eg: OVERLAY's RESIDENT.OBJ
  558.      #
  559.      #FILE <3rd party1>,<3rd party2>
  560.      BEGINAREA
  561.      #
  562.      #List the rest of your Clipper code files here.
  563.      #
  564.      #FILE <next Clipper file>
  565.      #  .....
  566.      #
  567.      #UNCOMMENT and list your own Clipper code libraries here
  568.      #
  569.      #
  570.      #UNCOMMENT and list your overlayable 3rd party libraries here
  571.      #as well as the VERTEX Library
  572.      #
  573.      #Allocates the VERTEX US-Library
  574.      #
  575.        ALLOCATE VERTEXUS
  576.      # ALLOCATE <3rd party>
  577.      ENDAREA
  578.      #
  579.      # UNCOMMENT and list 3rd party non-overlayable libraries here:
  580.      # VERTEX Root Module has to be here.
  581.      #LIB <3rd party>
  582.      LIB VERTROOT
  583.      #
  584.      # If you want the 5.01 debugger UN-COMMENT the following:
  585.      # NOTE: The 5.01 debugger library MUST be specified as a FILE
  586.      #
  587.      # FILE CLD.LIB
  588.      #
  589.      # UNCOMMENT for dLESKO's FUNCky 1.5 library
  590.      #
  591.      #@FUNCKY50.LNK
  592.      #
  593.      # Call the distribution script to overlay EXTEND.LIB
  594.      # or substitute for LIB EXTEND.LIB
  595.      #
  596.      @CL501MIN.LNK
  597.      #
  598.      # Microsoft LLIBCA C 6.00 library comes last if needed.
  599.      #
  600.      #LIB LLIBCA
  601.  
  602.  
  603.                     IMPORTANT ARRAY FUNCTION INFORMATION
  604.                     ------------------------------------
  605.      I have tried to put some usefull array handling functions together
  606.      which might come handy for You.
  607.  
  608.      All arrayfunctions are written entirely in CLIPPER 5.01 as most
  609.      other functions are and make full use of CLIPPERS new features
  610.      inclusive codeblocks.
  611.  
  612.      Whereever possible I have included some examples in the
  613.      functiondescription so You have some idea how to use them.
  614.  
  615.      Try them out, You can't break anything.
  616.  
  617.  
  618.  
  619.                              ArBigArrElem()
  620.                              ==============
  621.  
  622.      Function:       ArBigArrElem( <expA> ) --> integer
  623.  
  624.      Synopsis:       Checks an array and returns the length of the
  625.                      longest array-element. Useful for knowing the
  626.                      longest element when used in conjunction with
  627.                      arrays containing different types of elements or
  628.                      when used in conjunction with ACHOICE() to
  629.                      define correct display if the maximum width of the
  630.                      box is not known.
  631.  
  632.      Samples:        lArray :={ "short",;
  633.                                 "little longer",;
  634.                                 "very long display string" }
  635.                      llongest := ArBigArrElem( lArray )
  636.                      ltop := 0
  637.                      lleft := 0
  638.                      lbottom := 10
  639.                      lright := lleft + 1 + llongest
  640.                      lChoice := ACHOICE( ltop, lleft, lbottom,;
  641.                                          lright, lArray )
  642.  
  643.      Result:         an ACHOICE box where all elements are visible in
  644.                      their entire length.
  645.  
  646.      Notes:          Works on arrays of all types AND mixed types.
  647.                      Trailing spaces in CHARACTER arrays are NOT
  648.                      counted, leading spaces ARE counted. If the array
  649.                      contains a codeblock, the function returns 0 as
  650.                      codeblocks are not a selectable item in themselves
  651.                      and should only be called via the EVAL()
  652.                      function.
  653.  
  654.      Returns:        length of the longest array element or 0 if Type
  655.                      is other than C,N,L,D or M.
  656.  
  657.  
  658.                                ArBldArr()
  659.                                ==========
  660.  
  661.      Function:       ArBldArr( <expN1>, <expC1> ) --> array of strings
  662.  
  663.      Synopsis:       Builds an array from a delimited string
  664.  
  665.                      Fills an array with a colon delimited string of
  666.                      the form "John:Willy:Ralph:Eddy". The colon [:] is
  667.                      the delimiter.
  668.  
  669.                      The size of the array is set by the parameter
  670.                      <expN1>. If the number of elements defined is less
  671.                      than the actual amount of parameters in the colon
  672.                      delimited string, only the amount of defined
  673.                      elements are being created in the array and the
  674.                      rest discarded.
  675.  
  676.                      <expN1> Number of elements
  677.  
  678.                      <expC1> Colon delimited string of elements
  679.  
  680.      Example:        lunch:= {}
  681.                      lunch := ARBLDARR( 3,"Pizzas:Chickens:Burgers" )
  682.  
  683.      Returns:        Array containing the values passed
  684.  
  685.  
  686.  
  687.                                ARCOUNT()
  688.                                =========
  689.  
  690.      Function:       ARCOUNT( <expA>, <expC> ) --> integer
  691.  
  692.      Synopsis:       Counts exact matches of TYPES in array.
  693.  
  694.                      <expA>  Array to be searched.
  695.  
  696.                      <expC>  value of any type to be searched for in
  697.                              array
  698.  
  699.  
  700.      Examples:       lFields := DBSTRUCT()
  701.                      AEVAL( lFields, { | x | AADD( lFldTypes,;
  702.                                          x[ DBS_TYPE ] ) } )
  703.                      lNbrOfChar  := ARCOUNT( lFldTypes, "C" )
  704.                                         && counts C fields
  705.                      lNbrOfNum   := ARCOUNT( lFldTypes, "N" )
  706.                                         && counts N fields
  707.                      lNbrOfDate  := ARCOUNT( lFldTypes, "D" )
  708.                                         && counts D fields
  709.                      lNbrOfLogic := ARCOUNT( lFldTypes, "L" )
  710.                                         && counts L fields
  711.                      lNbrOfMemo  := ARCOUNT( lFldTypes, "M" )
  712.                                         && counts M fields
  713.                      lNbrOfMemo  := ARCOUNT( lFldTypes, NIL )
  714.                                         && counts NIL fields
  715.  
  716.      Returns:        number of matches found
  717.                      0 if no matches found.
  718.  
  719.  
  720.  
  721.                               AREVENOUT()
  722.                               ===========
  723.  
  724.      Function:       AREVENOUT( <expA1>, <expN1> ) --> array
  725.  
  726.      Synopsis:       Expands array elements to even length.
  727.  
  728.                      <expA1> array to expand
  729.  
  730.                      <expN1> width to expand each element to
  731.  
  732.                      This function will expand each array element to a
  733.                      given length. I have used it to achieve an even
  734.                      pushbutton menu by expanding all elements to the
  735.                      biggest in the array.
  736.  
  737.                      N.B. You may also shorten all elements to e
  738.                      specified length.
  739.  
  740.      Examples:       oldarray := {   "tiny",;
  741.                                      "short",;
  742.                                      "much longer" }
  743.  
  744.                      newarray := AREVENOUT( oldarray, 15 )
  745.  
  746.                      ##------ the new array looks like this ------ ##
  747.  
  748.                             "tiny  "
  749.                             "short "
  750.                             "much longer "
  751.  
  752.                      All elements are now 15 characters long
  753.  
  754.      Returns:        the new array
  755.  
  756.  
  757.  
  758.                                 ARMAX()
  759.                                 =======
  760.  
  761.      Function:       ArMax( <expA1>, [<expN1>, <expN2>] ) -->
  762.                      integer|float
  763.  
  764.      Synopsis:       Finds the largest number in a NUMERICAL array.
  765.  
  766.                      <expA1>    a numerical array
  767.  
  768.                      [<expN1>,
  769.                      <expN2>]   optional starting and ending position
  770.                                 for search defaults to 1
  771.                                 and last
  772.  
  773.      Examples:       lNumbers := { 10,2789,1,0,9567 }
  774.                      lLargest := ARMax( lNumbers )    && lLargest = 9567
  775.  
  776.                      lLargest := ARMax( lNumbers, 1, 4 )
  777.                                             && lLargest = 2789
  778.  
  779.      Notes:          <expN1> must always be smaller than <expN2> and
  780.                              mustn't be 0.
  781.  
  782.      Returns:        If <expN1> is less than 1 or larger than <expN2>,
  783.                      the function will return NIL. Also if <expN1> is
  784.                      less than 1 or <expN2> is larger than the array.
  785.                      Otherwise returns the largest number.
  786.  
  787.  
  788.  
  789.                                ARMAXPOS()
  790.                                ==========
  791.  
  792.      Function:       ARMAXPOS( <expA1> ) --> integer
  793.  
  794.      Synopsis:       Finds the position of the greatest number within
  795.                      an array.
  796.  
  797.                      <expA1>  numeric array to search.
  798.  
  799.      Examples:       lArray := { 1, 2067, 1077, 10, 5987 }
  800.  
  801.                      lPos := ARMAXPOS( lArray )&& lPos will contain 5
  802.  
  803.      Returns:        an integer identifying the position of the                     
  804.                      greatest number within the passed array returns 0
  805.                      if an error occured.
  806.  
  807.  
  808.                                 ARMIN()
  809.                                 =======
  810.  
  811.      Function:  ArMin(<expA1>,[<expN1>,<expN2>]) --> integer|float|NIL
  812.  
  813.      Synopsis:       Finds the smallest number in a NUMERICAL array.
  814.  
  815.                      <expA1> a numerical array
  816.  
  817.                      [<expN1>,
  818.                      <expN2>]  optional starting and ending position
  819.                                for search defaults to 1 and last
  820.  
  821.      Examples:       lNumbers := { 10,2789,1,0,9567 }
  822.  
  823.                      lSmallest := ARMin( lNumbers )   && lSmallest = 0
  824.  
  825.                      lSmallest := ARMin( lNumbers, 1, 3 )
  826.                                             && lSmallest = 1
  827.  
  828.      Notes:          <expN1> must always be smaller than <expN2> and
  829.                              mustn't be 0.
  830.  
  831.      Returns:        If <expN1> is less than 1 or larger than <expN2>,
  832.                      the function will return NIL. Also if <expN1> is
  833.                      less than 1 or <expN2> is larger than the array.
  834.                      Otherwise returns the smallest number.
  835.  
  836.  
  837.                                ARMINPOS()
  838.                                ==========
  839.  
  840.      Function:       ARMINPOS( <expA1> ) --> integer
  841.  
  842.      Synopsis:       Finds the position of the smallest number within
  843.                      an array.
  844.  
  845.                      <expA1>  numeric array to search.
  846.  
  847.      Examples:       lArray := { 2, 2067, 1077, 10, 5987 }
  848.  
  849.                      lPos := ARMINPOS( lArray )&& lPos will contain 1
  850.  
  851.      Returns:        an integer identifying the position of the
  852.                      smallest number within the passed array returns 0
  853.                      if an error occured.
  854.  
  855.  
  856.                             ARSHRINKARRAY()
  857.                             ===============
  858.  
  859.      Function:       ArShrinkArray( <expA>, <exp?> ) --> Array
  860.  
  861.      Synopsis:       This Function searches an array for a given
  862.                      expression and deletes this expression of the                     
  863.                      array, however leaving NO NIL elements in the                     
  864.                      array where the found expression was, effectively
  865.                      shrinking the array by the amount of found
  866.                      expressions.
  867.  
  868.                      <expA>  a single dimension array
  869.  
  870.                      <exp?>  an expression of any kind
  871.  
  872.      Note:           The passed expression <exp?> may NOT be an array
  873.                      and the passed array <expA> may ONLY be a single
  874.                      dimension array
  875.  
  876.                      i.e.:  test := { 0,3,NIL,4 }
  877.  
  878.                         ShrinkArray(test,0)
  879.  
  880.                         ... returns an array containing { 3, NIL, 4 }
  881.  
  882.                      not like the CLIPPER Function ADEL() which
  883.                      would leave the array at the same size with a
  884.                      trailing NIL element.
  885.  
  886.      Returns:        an array without passed expression <exp?>
  887.  
  888.  
  889.                              ARSMLARRELEM()
  890.                              ==============
  891.  
  892.      Function:       ArSmlArrElem( <expA> ) --> integer
  893.  
  894.      Synopsis:       Checks an array and returns the length of the
  895.                      smallest array-element. Useful for knowing the
  896.                      shortest element when used in conjunction with
  897.                      arrays containing different types of elements.
  898.  
  899.      Samples:        lArray := {    "short",;
  900.                                     "little longer",;
  901.                                     "very long display string" }
  902.                      lshortest := ArSmlArrElem( lArray )
  903.  
  904.      Notes:          Works on arrays of all types AND mixed types.
  905.                      Trailing spaces in CHARACTER arrays are NOT
  906.                      counted, leading spaces ARE counted. If the array
  907.                      contains a codeblock, the function returns 0 as
  908.                      codeblock are not a selectable item in themselves
  909.                      and should only be called via the EVAL()
  910.                      function.
  911.  
  912.      Returns:        length of the shortest array element or 0 if Type
  913.                      is other than C,N,L,D or M .
  914.  
  915.  
  916.  
  917.                                 ARSUM()
  918.                                 =======
  919.  
  920.      Function:       ARSUM( <expA1> ) --> float
  921.  
  922.      Synopsis:       Sums all numeric elements of an array.
  923.  
  924.                      <expA1> numerical array to sum
  925.  
  926.      Examples:       lArray := { 10, 11, 1, 2 }
  927.                      lTotal := ARSUM( lArray ) && lTotal contains 24
  928.  
  929.      Returns:        a float containing the sum of the array passed,
  930.                      on Error NIL
  931.  
  932.  
  933.  
  934.                      IMPORTANT BOX FUNCTION INFORMATION
  935.                      ==================================
  936.  
  937.      The box functions in general make use of some very fast C and
  938.      Assembler functions which I have not listed at present ( there
  939.      is really no need for it ).
  940.  
  941.      You should be able to make full use of them even without knowing
  942.      that there are any C or Assembler functions behind all this.
  943.      These C and Assembler functions are well behaved and can all be
  944.      overlayed ( at least I had no problems sofar ).
  945.  
  946.      All box functions make use wherever possible of all TEXT modes of
  947.      Your video card. However I am unable to test the functions on
  948.      all cards available, so if there is a problem with a specific
  949.      card, let me know what card You have and what the problem is. I
  950.      try to include the fixup in the next releases. Remember,
  951.      licensing the Library will guarantee You a bug-fix before the
  952.      next release, free of charge!
  953.  
  954.      IMPORTANT:
  955.      ----------
  956.      All BX.... functions make heavy use of ROM BIOS function calls and
  957.      use the IBM character set to draw the boxes. If You decide to
  958.      switch Your Graphics card into GRAPHICS MODE remember that all
  959.      characters will be display exclusive OR'd (XOR) with the current
  960.      display contents. They make no use of the attributes You may pass.
  961.      Thats why the frame around boxes displayed in Graphics mode on an
  962.      empty black screen will have ALLWAYS black as background color.
  963.  
  964.      I have been using BLINKER 1.51 for putting together the sample
  965.      programs and I think RTLINK or WARPLINK should be able to
  966.      handle them just as well.
  967.  
  968.  
  969.  
  970.                                 BXBOX()
  971.                                 =======
  972.  
  973.      Function:       BXBOX(<expN1>..<expN4>,[<expN5>],[<expN6>],[<expN7>],
  974.                            [<expN8>], [<expN9>] ) --> logical
  975.  
  976.      Synopsis:       Pops a Box on given coordinates
  977.  
  978.                      <expN1>..<expN4> Box coordinates on screen
  979.  
  980.                      [<expN5>] Boxtype as identified below...
  981.  
  982.                      [<expN6>] attribute of Box
  983.  
  984.                      [<expN7>] shadow position
  985.  
  986.                      [<expN8>] shadow foreground color
  987.  
  988.                      [<expN9>] shadow background color
  989.  
  990.                      [<expC1>] user defined character for boxframe
  991.  
  992.                      Boxtype definition for <expN5> being -1 to 15:
  993.  
  994.                      Box Type  Bottom  Right   Top    Left
  995.                      -------------------------------------------
  996.                      -1 (----)  -       -       -       -
  997.                      0  (0000)  S       S       S       S
  998.                      1  (0001)  S       S       S       D
  999.                      2  (0010)  S       S       D       S
  1000.                      3  (0011)  S       S       D       D
  1001.                      4  (0100)  S       D       S       S
  1002.                      5  (0101)  S       D       S       D
  1003.                      6  (0110)  S       D       D       S
  1004.                      7  (0111)  S       D       D       D
  1005.                      8  (1000)  D       S       S       S
  1006.                      9  (1001)  D       S       S       D
  1007.                      10 (1010)  D       S       D       S
  1008.                      11 (1011)  D       S       D       D
  1009.                      12 (1100)  D       D       S       S
  1010.                      13 (1101)  D       D       S       D
  1011.                      14 (1110)  D       D       D       S
  1012.                      15 (1111)  D       D       D       D
  1013.  
  1014.                      If a box type is chosen from this table, corner
  1015.                      characters will be automatically chosen to match
  1016.                      the sides.
  1017.  
  1018.                      -1 will allow user defineable box character to be
  1019.                      used.
  1020.  
  1021.      Notes:          Works best in TEXT modes only as You are unable to
  1022.                      use  attributes to display characters. As these
  1023.                      box drawing  functions are done with characters,
  1024.                      they will use colors only.
  1025.  
  1026.      Returns:        .T. if successfully created, otherwise .F.
  1027.  
  1028.  
  1029.                              BXPUSHBUTTON()
  1030.                              ==============
  1031.  
  1032.      Function:       BxPushButton( <expN1> .. <expN3>, <expA1>,
  1033.                      [<expL1>] ) --> integer
  1034.  
  1035.      Synopsis:       Sets up a number of HORIZONTAL or VERTICAL
  1036.                      pushbuttons and waits for user input.
  1037.  
  1038.                      <expN1>..<expN2> row/column coordinates of
  1039.                                       pushbottons.
  1040.  
  1041.                      <expN3>    button number to be used to start off
  1042.                                 with.
  1043.  
  1044.                      <expA1>    array of strings defining the buttons.
  1045.  
  1046.                      [<expL1>]  defines if buttons are displayed
  1047.                                 horizontal (.T.) or vertical (.F.)
  1048.                                 defaults to .T.
  1049.  
  1050.                      The function selects the first character of each
  1051.                      string defined in <expA1> as a shortcut key so
  1052.                      selection may be done either by using the first
  1053.                      character of each string or the cursor control
  1054.                      keys and ENTER. Colors used are in accord with the
  1055.                      current SETCOLOR() settings.
  1056.  
  1057.                      This function is a low level function and used by
  1058.                      all boxes which require user input. I have left it
  1059.                      out for use in other ways i.e. so you can create
  1060.                      your own boxes with user response.
  1061.  
  1062.  
  1063.      Examples:       lStart := 1
  1064.                      lChoices := { "YES","MAYBE","NO" }
  1065.                      lSelected := bxhpushbutton( 10, 20, lStart,lChoices )
  1066.  
  1067.                      DO CASE
  1068.                         CASE lSelected == 1 && yes
  1069.                             .... your code ...
  1070.                         CASE lSelected == 2 && maybe
  1071.                             ....
  1072.                         CASE lSelected == 3 && no
  1073.                             ....
  1074.                      ENDCASE
  1075.  
  1076.      Returns:        an integer identifying the selected choice,
  1077.                      otherwise 0
  1078.  
  1079.  
  1080.                                    BXMAKEBOX()
  1081.                                    ===========
  1082.  
  1083.      Function:       BXMAKEBOX( <expN1>..<expN4>,[expC],[expN5] )
  1084.                                   -->   string
  1085.  
  1086.      Synopsis:       Draws a shadow box on the screen at given
  1087.                      coordinates and saves the underlying screen area
  1088.                      as well as the current colorsettings.
  1089.  
  1090.                      <expN1>..<exp4> Screen coordinates of the box to
  1091.                                    be drawn.
  1092.  
  1093.                      The coordinates DO NOT include the drop shadow.
  1094.                      These are automatically included, so make sure you
  1095.                      have enough space for them. The shadow is 1 extra
  1096.                      character position depending upon the placing of
  1097.                      the shadow.
  1098.  
  1099.                      <expC>  an optional colorstring or color variable
  1100.                              for the popup box.
  1101.  
  1102.                      <expN5> an optional number defining the shadow
  1103.                              position. You can determine the Shadow
  1104.                              position on hand of the numeric keypad
  1105.                              on the Keyboard:
  1106.  
  1107.                             7  =  top left
  1108.                             9  =  top right
  1109.                             1  =  bottom left
  1110.                             3  =  bottom right
  1111.                             0  =  no shadow
  1112.  
  1113.      Examples:       lScrSave := BXMAKEBOX(5,5,10,10)
  1114.                         * draws a box at 5,5,10,10. Color is as defined
  1115.                      by SETCOLOR()
  1116.                         * shadow position is based on C_SHADPOS.
  1117.  
  1118.                      lScrSave := BXMAKEBOX(5,5,10,10,C_POPCOL)
  1119.                         * draws a box at 5,5,10,10. Color is C_POPCOL.
  1120.                         * shadow position is based on C_SHADPOS.
  1121.  
  1122.                      lScrSave := BXMAKEBOX(5,5,10,10,C_POPCOL,9)
  1123.                         * draws a box at 5,5,10,10. Color is as defined
  1124.                         * by SETCOLOR() shadow position is 9 (upper right
  1125.                         * hand corner)
  1126.  
  1127.      Notes:          Do not use the CLIPPER Function RESTSCREEN()
  1128.                      to restore saved screenareas which are stored in
  1129.                      the string returned by the BXMAKEBOX() function.
  1130.                      Use the provided BXUNBOX() function instead.
  1131.                      If You use this function in Graphics mode,
  1132.                      remember that You can't use attributes to display
  1133.                      characters. In Graphics mode characters are
  1134.                      displayed with COLOR, not ATTRIBUTES.
  1135.  
  1136.      Returns:        a string containing the coordinates, colorsettings
  1137.                      and underlying screenarea.
  1138.  
  1139.  
  1140.                                BXSCROLL()
  1141.                                ==========
  1142.  
  1143.      Function:       BXSCROLL( <expN1> .. <expN7> ) --> logical
  1144.  
  1145.      Synopsis:       Scroll area of given box-coordinates
  1146.  
  1147.                      <expN1> number of lines to scroll ( 0 clears
  1148.                              the area within the parameters
  1149.                              <expN3> to <expN6>.
  1150.  
  1151.                      <expN2> attribute to use for scroll
  1152.  
  1153.                      <expN3> .. <expN6> area coordinates to scroll
  1154.                                         ( top, left, bottom, right )
  1155.  
  1156.                      <expN7>    direction to scroll ( 1 = up, 0 = down )
  1157.  
  1158.                      This function will scroll a given area within a
  1159.                      box either up or down using a given attribute. It
  1160.                      scrolls the area a number of lines.
  1161.  
  1162.      Returns:        .T. if successful, otherwise .F.
  1163.  
  1164.  
  1165.                                BXUNBOX()
  1166.                                =========
  1167.  
  1168.      Function:       BXUNBOX( <expC> )
  1169.  
  1170.      Synopsis:       Removes a box which was previously created by the
  1171.                      function BXMAKEBOX()
  1172.  
  1173.                      <expC>  Saved screen string created by
  1174.                              BXMAKEBOX()
  1175.  
  1176.      Examples:       lScrSave := BXMAKEBOX( top, left, bottom, right )
  1177.  
  1178.                      ... your code ...  && lScrSave contains the saved
  1179.                                         && screen
  1180.  
  1181.                      .................
  1182.  
  1183.                      BXUNBOX( lScrSave )
  1184.  
  1185.      Notes:          Do not use with any other saved screen string than
  1186.                      the one created by the BXMAKEBOX() function.
  1187.  
  1188.      Returns:        Nothing
  1189.  
  1190.  
  1191.  
  1192.                   IMPORTANT DATABASE FUNCTION INFORMATION
  1193.                   =======================================
  1194.  
  1195.      There are a lot of extra DB functions NANTUCKET did not supply so
  1196.      I have tried to close the gap a little.
  1197.  
  1198.      Some of the DB Functions should really be classed as META
  1199.      functions ( where do You draw the line? ), but I left them here.
  1200.  
  1201.      All DB Functions make extensive use of codeblocks so they should
  1202.      be rather fast. Whereever I could I also made use of lots of
  1203.      CLIPPERS Objects, especially the TBROWSE objects as You may
  1204.      find in the DBTBLVIEW() function.
  1205.  
  1206.  
  1207.                               DBBIGFIELD()
  1208.                               ============
  1209.  
  1210.      Function:       DBBigField( <expC> ) --> integer
  1211.  
  1212.      Synopsis:       Checks a database and finds the length of the
  1213.                      longest field within that database.
  1214.  
  1215.                      <expC>  the ALIAS or the NAME of the database to
  1216.                              search
  1217.  
  1218.                      This is a very useful funtion if you don't know
  1219.                      the length of the fields within a database and you
  1220.                      want to display the contents of a database on the
  1221.                      screen. Use this function to find out how long the
  1222.                      longest Field is.
  1223.  
  1224.                      Checks if the database is in use and searches it.
  1225.                      Opens the database if not in use in the next lower
  1226.                      unoccupied workarea and searches it.
  1227.  
  1228.      Examples:       lDbase := "MYDATA"
  1229.                      llongfield := DbBigField( lDbase )
  1230.  
  1231.      Result:         "llongfield" contains a numeric value specifying
  1232.                      the length of the longest field.
  1233.  
  1234.      Returns:        an integer specifying the length of the longest
  1235.                      field in the database ( this is NOT the length of
  1236.                      the fieldname )
  1237.  
  1238.  
  1239.  
  1240.                               DBCONWORD()
  1241.                               ===========
  1242.  
  1243.      Function:       DbConWord( <expC>, <expL> ) --> logical
  1244.  
  1245.      Synopsis:       Function converts a CLIPPER or DBase File into a
  1246.                      MS-WORD Datafile, that is, it actually copies
  1247.                      the Data into a newly created MS-WORD Datafile.
  1248.  
  1249.                      Requires a database to be in use in the current
  1250.                      workarea.
  1251.  
  1252.                      <expC> contains the Filename of the MS-WORD
  1253.                             Datafile to be createt.
  1254.  
  1255.                      <expL> logical expression denotes if erased
  1256.                             records are to be copied (.F.)  or not (.T.).
  1257.                             Defaults to (.T.) ... that is - erased
  1258.                             records are NOT copied.
  1259.  
  1260.      Returns:        .T. if successfully transfered, .F. on error.
  1261.  
  1262.  
  1263.                                DBDELREC()
  1264.                                ==========
  1265.  
  1266.      Function:       DBDELREC( [<expC>], [<expN>] ) --> integer
  1267.  
  1268.      Synopsis:       Pops up a dialog box to allow deletion or
  1269.                      recalling of the current record.
  1270.  
  1271.                      The prompt in the box depends upon the current
  1272.                      status of the record. If the record is currently
  1273.                      deleted, the prompts will be:
  1274.  
  1275.                         Un-Delete
  1276.                         No Action
  1277.  
  1278.                      otherwise
  1279.  
  1280.                         Delete
  1281.                         No Action
  1282.  
  1283.  
  1284.                      [<expC>] optional box colorstring defaults to
  1285.                      C_POPCOL
  1286.  
  1287.                      [<expN>] optional shadowposition defaults to
  1288.                      C_SHADPOS
  1289.  
  1290.      Examples:       lWhatHappened := DBDELREC()
  1291.  
  1292.  
  1293.      Returns:        1 if record was deleted
  1294.                      -1 if record was restored
  1295.                      0 if nothing happened
  1296.  
  1297.  
  1298.                               DBEXPDATA()
  1299.                               ===========
  1300.  
  1301.      Function:       DbExpData( [<expC>], [<expN1>], [<expN2>, <expN3>]
  1302.                                      --> NIL
  1303.  
  1304.      Synopsis:       This function gives the user a choice of exporting
  1305.                      a set of data previously defined. The function
  1306.                      works on the current workarea and exports ALL
  1307.                      UNDELETED records found.
  1308.  
  1309.                      To export only part of the data, create a
  1310.                      temporary database and use the function on it.
  1311.  
  1312.                      [<expC>] optional box color string defaults to
  1313.                               C_POPCOL
  1314.  
  1315.                      [<expN1>] optional shadow defaults to C_SHADPOS
  1316.  
  1317.                      [<expN2>..<expN3>] optional top/left coordinates
  1318.                                         of box defaults center.
  1319.  
  1320.                      Currently supported export formats are:
  1321.  
  1322.                              DBASE III plus
  1323.                                   SDF
  1324.                             ASCII delimited
  1325.                             MS-WORD Datafile
  1326.  
  1327.                      others are in preperation.
  1328.  
  1329.                      During the operation a box is being presented
  1330.                      showing the progress by displaying the amount of
  1331.                      records still to be processed.
  1332.  
  1333.      Note:           a workarea and database must be in use before this
  1334.                      function is called.
  1335.  
  1336.      Examples:       USE EXPDB
  1337.                      DBEXPDATA()
  1338.  
  1339.                      - or -
  1340.  
  1341.                      DBEXPDATA( Color, Shadow, top, Left )
  1342.  
  1343.      Returns:        Nothing
  1344.  
  1345.  
  1346.                               DBFLDEXIST()
  1347.                               ============
  1348.  
  1349.      Function:       DBFLDEXIST( <expC1>, <expC2> ) --> logical
  1350.  
  1351.      Synopsis:       Checks if Field exist in Database.
  1352.  
  1353.                      The function will check if a given fieldname exist
  1354.                      in a sepcified database.
  1355.  
  1356.                      <expC1> database to search for field
  1357.  
  1358.                      <expC2> fieldname to search for
  1359.  
  1360.      Examples:       ? DBFLDEXIST( "MYDBASE.DBF", "NAMES" )
  1361.  
  1362.                         && prints .T. if "NAMES" exist in "MYDBASE.DBF"
  1363.  
  1364.      Returns:        .T. if field exists;
  1365.                      otherwise .F.
  1366.  
  1367.                               DBIMPDATA()
  1368.                               ===========
  1369.  
  1370.      Function:       DbImpData( [<expC>], [<expN1>], [<expN2>, <expN3>] )
  1371.                                       --> NIL
  1372.  
  1373.      Synopsis:       This function gives the user a choice of importing
  1374.                      a set of data. The function works on the current
  1375.                      workarea and imports ALL data of the given file.
  1376.  
  1377.                      [<expC>] optional box color string defaults to
  1378.                               C_POPCOL
  1379.  
  1380.                      [<expN1>] optional shadow defaults to C_SHADPOS
  1381.  
  1382.                      [<expN2>..<expN3>] optional top/left coordinates
  1383.                                         of box defaults center.
  1384.  
  1385.                      Currently supported import formats are:
  1386.  
  1387.                              DBASE III plus
  1388.                                   SDF
  1389.                             ASCII delimited
  1390.  
  1391.                      During the operation a box is being presented
  1392.                      showing the progress by displaying the amount of
  1393.                      records imported.
  1394.  
  1395.      Note:           a workarea and database must be in use before this
  1396.                      function is called.
  1397.  
  1398.      Examples:       USE EXPDB
  1399.                      DBIMPDATA()
  1400.  
  1401.                      - or -
  1402.  
  1403.                      DBIMPDATA( Color, Shadow, top, Left )
  1404.  
  1405.      Returns:        Nothing
  1406.  
  1407.                                DBINUSE()
  1408.                                =========
  1409.  
  1410.      Function:       DbInUse( <expC1>, [<expN1>] ) --> Workarea
  1411.  
  1412.      Synopsis:       Searches undestructive in all Workareas if the
  1413.                      ALIAS passed in <expC> is already in Use.
  1414.  
  1415.                      <expC1> Alias to be searched for.
  1416.  
  1417.                      [<expN1>] optional starting workarea.
  1418.  
  1419.      Notes:          The Function will terminate as soon as the first
  1420.                      ALIAS was found.
  1421.  
  1422.      Returns:        Workarea if ALIAS was found, 0 if ALIAS was not
  1423.                      found.
  1424.  
  1425.                                DBISDBF()
  1426.                                =========
  1427.  
  1428.      Function:       DBISDBF( <expC1> ) --> logical
  1429.  
  1430.      Synopsis:       Checks if Database is valid DBASE format.
  1431.  
  1432.                      The function tests the database in question by
  1433.                      trying to open it. On success, the database will
  1434.                      be closed and the old settings reinstated -
  1435.                      returning .T.; on error the function will reset
  1436.                      the old settings and return .F.;
  1437.  
  1438.                      That the function doesn't crash is made possible
  1439.                      by means of the VERTEX Error handling function.
  1440.  
  1441.      Examples:       lisvalid := dbisdbf( "SAMPLE.DBF" )
  1442.                             && lisvalid contains .T. if valid database
  1443.  
  1444.      Returns:        .T. if database is valid and not corrupted
  1445.                      otherwise .F.
  1446.  
  1447.                                DBISMEMO()
  1448.                                ==========
  1449.  
  1450.      Function:       BISMEMO() --> logical
  1451.  
  1452.      Synopsis:       Checks if there exists a MEMO-field for a
  1453.                      database.
  1454.  
  1455.  
  1456.      Examples:       DBISMEMO()
  1457.  
  1458.                        - or -
  1459.  
  1460.                      ALIAS->( DBISMEMO() )
  1461.  
  1462.      Returns:        .T. if there exists a memofield for the database;
  1463.                      otherwise .F.
  1464.  
  1465.  
  1466.                                 DBJUMP()
  1467.                                 ========
  1468.  
  1469.      Function:       DBJUMP() --> string
  1470.  
  1471.      Synopsis:       Pops up available, open Databases for selection.
  1472.  
  1473.                      The function searches all possible workareas for
  1474.                      open databases and pops up a selection of
  1475.                      available databases. The user may select a
  1476.                      database which will become then the current
  1477.                      database.
  1478.  
  1479.      Examples:       USE customer
  1480.                      USE addresses
  1481.                      DBJUMP()        && pops a selection of
  1482.                                      && CUSTOMER and ADDRESSES
  1483.                                      && allowing the user to change
  1484.                                      && the workarea to any of them
  1485.  
  1486.      Returns:        the alias of the selected workarea if changed
  1487.                      successful, otherwise the alias of the current
  1488.                      workarea.
  1489.  
  1490.                               DBLOOKFOR()
  1491.                               ===========
  1492.  
  1493.      Function:       DbLookFor( <expC1> ) --> Alias
  1494.  
  1495.      Synopsis:       Searches a database for records fitting a search-
  1496.                      expression.
  1497.  
  1498.                      <expC1>  Search expression which must evaluate to
  1499.                               a logical value
  1500.  
  1501.                      It searches the Database of the current Workarea
  1502.                      and will write the Recordnumber of the found
  1503.                      Records in a temporary File.
  1504.  
  1505.      Filename:       TMP#####.##$  where # is a numeric value
  1506.  
  1507.      Structure:      Fieldname -> FOUNDREC
  1508.                      Fieldtype -> NUMERIC
  1509.                      Fieldlength ->10
  1510.  
  1511.      ALIAS:          RECFOUND
  1512.  
  1513.                      Recordnumbers are written in logical order of any
  1514.                      found records. If any records have been found the
  1515.                      Alias of the temporary Database will be passed,
  1516.                      otherwise an empty String is passed.
  1517.  
  1518.      Notes:          Apart from type-checking  of the passed parameter
  1519.                      and the amount of parameters passed, no other
  1520.                      check is done. An incorrect expression results in
  1521.                      an error. Best use the function MFMAKEEXPR()
  1522.                      to create interactively a VALID expression.
  1523.  
  1524.                      The Database for the found records is opened in
  1525.                      EXCLUSIVE mode in the next available lowest
  1526.                      workarea and remains opened. If a call to this
  1527.                      function has been done previously, the same
  1528.                      workarea will be used, all previously found
  1529.                      records dropped and a new set created.
  1530.  
  1531.                      Processes the database in its natural order unless
  1532.                      Indexes are in use. In this case the Index-order
  1533.                      is used.
  1534.  
  1535.      NETWORK USERS:  Be aware that this functions does not lock the
  1536.                      found records in any way. This means that other
  1537.                      users may delete the found records after the
  1538.                      function terminates and you are not aware of this
  1539.                      - thus it may lead to an erroneous result.
  1540.  
  1541.      Returns:        Alias of database where found recordnumbers are
  1542.                      listed for further processing
  1543.  
  1544.  
  1545.                               DBSELDBVAL()
  1546.                               ============
  1547.  
  1548.      Function:       DbSelDbVal( <expC1>, <expN1>..<expN4>,
  1549.                                 [<expC2>], [<expC3>] ) --> Fieldvalue
  1550.  
  1551.      Synopsis:       A function which returns a fieldvalue from a
  1552.                      database chosen by a user.
  1553.  
  1554.                      <expC1>  a valid fieldname of a database in use in
  1555.                               the current workarea.
  1556.  
  1557.                      <expN1>..<expN4> valid coordinates of the window
  1558.                                       in which a selection of fieldvalues 
  1559.                                       appears.
  1560.  
  1561.                      [<expC2>] an optional parameter used as header of
  1562.                                the window.
  1563.  
  1564.                      [<expC3>] optional displaycolor string
  1565.  
  1566.                      [<expN4>] optional shadow position
  1567.  
  1568.                      The window will be created and a selection of
  1569.                      fieldvalues will appear. The order of the values
  1570.                      depends upon the index currently in use or natural
  1571.                      order if no index is in use. A highlight bar is
  1572.                      used to scan the values by means of the Cursor
  1573.                      control keys as well as PgUP and PgDN. This
  1574.                      function requires the used database to be opened
  1575.                      in shared modus.
  1576.  
  1577.      Notes:          The fieldwidth will be adjusted to the size of the
  1578.                      window. It means that fieldvalues larger than the
  1579.                      window will be truncated to fit the window. This
  1580.                      is of particular interest for NUMERIC fields since
  1581.                      the number displayed may not be the correct
  1582.                      number: e.g.
  1583.  
  1584.  
  1585.                             +------+
  1586.                             |123456|7890 <--    a numeric field, 10 digits +
  1587.                             |      |            a window, 6 digits wide =
  1588.                             +------+            a displayed number of first 6
  1589.                                                 digits
  1590.  
  1591.                      although only part of the fieldvalue is being
  1592.                      displayed, the complete fieldvalue will be
  1593.                      returned. Make sure that the window for numeric
  1594.                      fields wide enough to allow the user to select the
  1595.                      right number.
  1596.  
  1597.                      The fieldname passed must be a valid fieldname for
  1598.                      the database in use. No parameter checking is done
  1599.                      apart from correct type.
  1600.  
  1601.      Return:         fieldvalue if successful empty string if not
  1602.  
  1603.  
  1604.                              DBSHRINKFILE()
  1605.                              ==============
  1606.  
  1607.      Function:       DBShrinkFile() --> logical
  1608.  
  1609.      Synopsis:       Packs a Database and updates associated indexes.
  1610.  
  1611.                      Requires an open database in the current workarea.
  1612.                      All open Indexes will be updated during the
  1613.                      packing process:
  1614.  
  1615.  
  1616.      Notes:          Database will be locked during packing process.
  1617.  
  1618.      Returns:        .T. if packing process was successful, .F. if
  1619.                      aborted or unsuccessful of whatever reason. These
  1620.                      reasons could be:
  1621.  
  1622.                      1)  Database not opened before functioncall
  1623.                      2)  Database could not be locked and user
  1624.                          terminates function.
  1625.  
  1626.                               DBTBLVIEW()
  1627.                               ===========
  1628.  
  1629.      Function:       DBTBLVIEW(<expC1>,[<expC2>,<expN1>..<expN4>],[<expL1>])
  1630.                                      --> logical
  1631.  
  1632.      Synopsis:       A tabular Database editor/viewer based upon
  1633.                      CLIPPERS TBROWSE objects. You may call this
  1634.                      function if You don't like the blockformat of
  1635.                      datamanipulation. It does basically the same as
  1636.                      DBDATAENTRY() however at present there are some
  1637.                      functions not available with this Tabelviewer as
  1638.                      there are with DBDATAENTRY().
  1639.  
  1640.                      <expC1>    a databasename to work on ( this is NOT
  1641.                                 the ALIAS )
  1642.  
  1643.                      [<expC2>]  an optional index to be active while
  1644.                                 working with the database
  1645.  
  1646.                      [<expN1>..
  1647.                      <expN4>]   optional display parameters of the
  1648.                                 Table defaults to 3,3,MAXROW()-3,MAXCOL()-3
  1649.  
  1650.                      [<expL1>]  optional logical to allow table
  1651.                                 editing, .T. edits, .F. does allow 
  1652.                                 only browse; defaults to .F.
  1653.  
  1654.      Returns:        .T. Data was worked on, all ok.,;
  1655.                      .F. Parameter error
  1656.  
  1657.                                DBFLDSUM()
  1658.                                ==========
  1659.  
  1660.      Function:       DBFLDSUM( <expC1>|<expN1> ) --> float
  1661.  
  1662.      Synopsis:       Sum a Field of a database currently in use.
  1663.  
  1664.                      The function is adding up all values of a database
  1665.                      field either passed by NAME or FIELDPOSITION.
  1666.  
  1667.                      <expC1>  name of databasefield to sum
  1668.  
  1669.                      <expN1>  fieldposition of databasefield to sum
  1670.  
  1671.  
  1672.      Examples:       USE ACCOUNTS
  1673.                      lTotal := DBFLDSUM( 2 )
  1674.  
  1675.                       - or -
  1676.  
  1677.                      lTotal := DBFLDSUM( "PAYMENT" )
  1678.  
  1679.                      both do the same and return the same value.
  1680.  
  1681.  
  1682.      Returns:        a float number representing the TOTAL of the
  1683.                      Field, 0 on error.
  1684.  
  1685.                               DBZAPDB()
  1686.                               =========
  1687.  
  1688.      Function:       DbZapDb() --> logical
  1689.  
  1690.      Synopsis:       Zaps a database, indexes and all memofields
  1691.                      currently in use
  1692.  
  1693.                      The Function takes care of Network locking itself.
  1694.  
  1695.      Examples:       USE CUSTOMER INDEX SNAME
  1696.                      lResult := DBZAP()
  1697.                               && lResult contains .T. if zapping was
  1698.                               && successful. Index SNAME is also zapped
  1699.  
  1700.      Returns:        .T. if successful
  1701.                      .F. if unsuccessful for whatever reason
  1702.  
  1703.                     IMPORTANT DATE FUNCTION INFORMATION
  1704.                     ===================================
  1705.  
  1706.      CLIPPER somehow neglected the DATE functionality and if You need
  1707.      some DATE Functions.... well here they are.
  1708.  
  1709.      For the Date calculations, all DATE Functions will temporarily
  1710.      change the DATE to ANSI standard, do the calculations and then
  1711.      switch back to whatever DATEFORMAT You choose to run Your system
  1712.      on.
  1713.  
  1714.      I found this the most reliable way of calculating DATES so one
  1715.      knows where the DAYS and the MONTHS etc. are...
  1716.  
  1717.  
  1718.                               DTDATEADD()
  1719.                               ===========
  1720.  
  1721.      Function:       DTDATEADD( <expD>, <expN1>, <expN2> ) --> Date
  1722.  
  1723.      Synopsis:       Adds or subtracts days, weeks, months or years
  1724.                      to/from a given date.
  1725.  
  1726.                      <expD>  date to work on
  1727.  
  1728.                      <expN1>    a positive or negative integer to add
  1729.                                 or subtract from date <expD>
  1730.  
  1731.                      <expN2> action as defined in VERTEX.CH:
  1732.  
  1733.                         DT_DAY= add days
  1734.                         DT_WEEK  = add weeks
  1735.                         DT_MONTH = add months
  1736.                         DT_YEAR  = add years
  1737.  
  1738.      Examples:       DTDATEADD( DATE(), 5, DT_DAY )     && adds 5 days
  1739.                      DTDATEADD( DATE(), -5, DT_DAY )    && subtract 5 days
  1740.                      DTDATEADD( DATE(), 5, DT_MONTH )   && DTs 5 months
  1741.                      DTDATEADD( DATE(), -5, DT_MONTH )  && subtract 5 months
  1742.  
  1743.      Notes:          If the number <expN1> is of a positive value, it
  1744.                      will be added to the date in <expD>; if the number
  1745.                      <expN1> is of a negative value, it will be
  1746.                      subtracted. The function takes care itself of
  1747.                      leapyears.
  1748.  
  1749.      Returns:        a date as result of the operation,
  1750.                      NIL if wrong parameters were passed
  1751.  
  1752.                                DTBEGEND()
  1753.                                ==========
  1754.  
  1755.      Function:       DTBEGEND( <expD>, <expN1>, <expN2>, [<expN3>] ) 
  1756.                                 --> Date
  1757.  
  1758.      Synopsis:       Determines begin or end of week, month or quarter
  1759.  
  1760.                      <expD>  Date to examine
  1761.  
  1762.                      <expN1>    Beginning ( WEEK_BEGIN ) or
  1763.                                 End ( WEEK_END ) of ...
  1764.  
  1765.                      <expN2>    Week ( OF_WEEK ), or Month ( OF_MONTH ),
  1766.                                 or Quarter ( OF_QUARTER ) in which...
  1767.                                 input Date <expD> falls.
  1768.  
  1769.                      WEEK_BEGIN, WEEK_END, OF_WEEK,
  1770.                      OF_MONTH, OF_QUARTER are Macros defined in
  1771.                      VERTEX.CH
  1772.  
  1773.      Options:        If week, <expN3> is day of the week beginning or
  1774.                      end of the week <expN1> falls on, with sunday
  1775.                      being 1 and saturday being 7.
  1776.  
  1777.      Examples:       cdate := ctod("01/15/90")
  1778.                      bow:= DTBEGEND( cdate, WEEK_BEGIN, OF_WEEK, 1 )
  1779.                                         && beg of week
  1780.  
  1781.                      eow:= DTBEGEND( cdate, WEEK_END, OF_WEEK, 7 )
  1782.                                         && end of week
  1783.  
  1784.                      bom:= DTBEGEND( cdate, WEEK_BEGIN, OF_MONTH )
  1785.                                         && beg of month
  1786.  
  1787.                      eow:= DTBEGEND( cdate, WEEK_END, OF_MONTH )
  1788.                                         && end of month
  1789.  
  1790.                      boq:= DTBEGEND( cdate, WEEK_BEGIN, OF_QUARTER )
  1791.                                         && beg of quarter
  1792.  
  1793.                      eoq:= DTBEGEND( cdate, WEEK_END, OF_QUARTER )
  1794.                                         && end of quarter
  1795.  
  1796.      Returns:        a date depending upon the action done
  1797.  
  1798.                                 DTBOM()
  1799.                                 =======
  1800.  
  1801.      Function:       DTBOM( [<expD>] ) --> date
  1802.  
  1803.      Synopsis:       Calculates the beginning of the month date.
  1804.  
  1805.                      [<expD>] optional date defaults to current date.
  1806.  
  1807.      Examples:       lStartDate := DTBOM( CTOD( "10/15/90" ) )
  1808.                             && lStartDate will contain 10/01/90
  1809.  
  1810.      Returns:        Beginning DATE of the MONTH in which the passed
  1811.                      parameter falls; NIL if invalid parameter is
  1812.                      passed.
  1813.  
  1814.                                 DTBOY()
  1815.                                 =======
  1816.  
  1817.      Function:       DTBOY( [<expD>] ) --> date
  1818.  
  1819.      Synopsis:       Calculates the beginning of the year a given date
  1820.                      falls in.
  1821.  
  1822.                      [<expD>] optional date defaults to current date.
  1823.  
  1824.      Examples:       lStartYear := DTBOY( CTOD( "10/15/90" ) )
  1825.                             && lStartYear will contain 01/01/90
  1826.  
  1827.      Returns:        Beginning DATE of the YEAR in which the passed
  1828.                      parameter falls; NIL if invalid parameter is
  1829.                      passed.
  1830.  
  1831.                              DTCHKDTEFMT()
  1832.                              =============
  1833.  
  1834.      Function:       DtChkDteFmt( <expC> ) --> array
  1835.  
  1836.      Synopsis:       Accepts a dateformat string and checks its
  1837.                      validity.
  1838.  
  1839.                      <expC1> Date formatstring as used by the SET()
  1840.                              function
  1841.  
  1842.                      Comparison is done according to the country
  1843.                      specific date formats as defined in CLIPPER when
  1844.                      using the SET( _SET_DATEFORMAT ) function.
  1845.  
  1846.                      country identifiers as defined by CLIPPER:
  1847.  
  1848.                         1 = AMERICAN
  1849.                         2 = ANSI
  1850.                         3 = BRITISH
  1851.                         4 = FRENCH
  1852.                         5 = GERMAN
  1853.                         6 = ITALIAN
  1854.                         7 = JAPAN
  1855.                         8 = USA
  1856.  
  1857.      Returns:        an array with 2 elements
  1858.  
  1859.                      element[1]contains .T. if dateformat was correct,
  1860.                      otherwise .F.
  1861.                      element[2]contains the country identifier as
  1862.                      defined by CLIPPER if dateformat was correct,
  1863.                      otherwise 0
  1864.  
  1865.                                DTDAYSIN()
  1866.                                ==========
  1867.  
  1868.      Function:       DTDAYSIN( <expD> ) --> integer
  1869.  
  1870.      Synopsis:       Calculates number of days in a month
  1871.  
  1872.                      <expD>  a date which is used to calculate the
  1873.                              number of dates in the month the date
  1874.                              is falling in.
  1875.  
  1876.      Examples:       ? DAYSIN( CTOD( "02/29/1992" ) )
  1877.                             && prints the number 29
  1878.  
  1879.      Returns:        an integer representing the number of days of the
  1880.                      month a passed Date falls into. 0 if an error
  1881.                      occured.
  1882.  
  1883.  
  1884.                                 DTDIFF()
  1885.                                 ========
  1886.  
  1887.      Function:       DTDIFF( <expD1>, <expD2>, <expN> ) --> integer
  1888.  
  1889.      Synopsis:       calculates the difference between two given dates
  1890.                      depending upon action chosen.
  1891.  
  1892.                      <expD1> start date
  1893.  
  1894.                      <expD2> end date
  1895.  
  1896.                      <expN>  action as defined in VERTEX.CH:
  1897.  
  1898.                         DT_DAY= in days
  1899.                         DT_WEEK  = in weeks
  1900.                         DT_MONTH = in months
  1901.                         DT_YEAR  = in years
  1902.  
  1903.      Examples:       lDate1    := CTOD( "10/15/90" )
  1904.                      lDate2    := CTOD( "10/26/90" )
  1905.                      diffdays  := DTDIFF(adate,adate2, DT_DAY)
  1906.                      diffweeks := DTDIFF(adate,adate2, DT_WEEK)
  1907.                      diffmonth := DTDIFF(adate,adate2, DT_MONTH)
  1908.                      diffyears := DTDIFF(adate,adate2, DT_YEAR)
  1909.  
  1910.      Returns:        integer representing the difference of both dates
  1911.                      depending upon action chosen.
  1912.  
  1913.                                 DTDINM()
  1914.                                 ========
  1915.  
  1916.      Function:       DTDINM( [<expD>] ) --> integer
  1917.  
  1918.      Synopsis:       Calculates number of days in month of given date.
  1919.  
  1920.                      [<expD>] optional date defaults to DATE()
  1921.  
  1922.                      This function also takes consideration of Leap
  1923.                      Years.
  1924.  
  1925.      Examples:       DTDINM( CTOD( "10/20/89" ) ) returns 31
  1926.  
  1927.      Returns:        an integer representing the amount of days in the
  1928.                      month of parameter or current date.
  1929.  
  1930.                                 DTDTOF()
  1931.                                 ========
  1932.  
  1933.      Function:       DTDTOF() --> string
  1934.  
  1935.      Synopsis:       Returns the current Date-Format string
  1936.  
  1937.                      The function returns the current date setting as a
  1938.                      format string 8 characters OR 6 characters long,
  1939.                      unlike CLIPPERS DTOS() function which will
  1940.                      always return a string YYYYMMDD.
  1941.  
  1942.      Examples:       SET DATE TO ANSI
  1943.                      lFormat := DTDTOF()
  1944.  
  1945.                      && lFormat contains the string "yyyy.mm.dd" if century
  1946.                      && is set on, otherwise it contains "yy.mm.dd"
  1947.  
  1948.      Returns:        a date format string according to the current
  1949.                      setting
  1950.  
  1951.                                 DTDTOW()
  1952.                                 ========
  1953.  
  1954.      Function:       DTDTOW( [<expD>] ) --> string
  1955.  
  1956.      Synopsis:       Converts a date to a sentence.
  1957.  
  1958.                      The Function convertes a given date to a sentence.
  1959.  
  1960.                      [<expD>] optional date defaults to DATE()
  1961.  
  1962.      Examples:       DTDTOW( CTOD( "12/10/90" ) ) 
  1963.                                         && returns "December 10th, 1990"
  1964.                      DTDTOW( CTOD( "12/01/90" ) ) 
  1965.                                         && returns "December 01st, 1990"
  1966.                      DTDTOW( CTOD( "12/03/90" ) ) 
  1967.                                         && returns "December 03rd, 1990"
  1968.  
  1969.      Returns:        a string containing a date converted to a sentence
  1970.                      if correct date was passed; otherwise an empty
  1971.                      string
  1972.  
  1973.  
  1974.                                 DTDOY()
  1975.                                 =======
  1976.  
  1977.      Function:       DTDOY( <expD> ) --> integer
  1978.  
  1979.      Synopsis:       Calculates the day-of-year from a given date.
  1980.  
  1981.                      <expD>  a date defaults to current date
  1982.  
  1983.      Examples:       DTDOY( CTOD("03/17/92") )&& returns 77
  1984.  
  1985.      Returns:        an integer
  1986.  
  1987.                               DTSETDATE()
  1988.                               ===========
  1989.  
  1990.      Function:       DTSETDATE( [<expN1>]|[<expC1>] ) --> string
  1991.  
  1992.      Synopsis:       Sets a date to a defined date format
  1993.  
  1994.                      [<expN1>]|[<expC1>]  numeric or string value
  1995.                      identifying the wanted date format
  1996.  
  1997.                      When using a numeric value, keep in mind that only
  1998.                      the following values are correct:
  1999.  
  2000.                             1 = AMERICAN
  2001.                             2 = ANSI
  2002.                             3 = BRITISH
  2003.                             4 = FRENCH
  2004.                             5 = GERMAN
  2005.                             6 = ITALIAN
  2006.                             7 = JAPAN
  2007.                             8 = USA
  2008.  
  2009.                      The string values have been pre-defined in the
  2010.                      headerfile VERTEX.CH and may used as follows
  2011.  
  2012.                             _AMERICAN
  2013.                             _ANSI
  2014.                             _BRITISH
  2015.                             _FRENCH
  2016.                             _GERMAN
  2017.                             _ITALIAN
  2018.                             _JAPAN
  2019.                             _USA
  2020.  
  2021.                      You may also define Your own dateformat however
  2022.                      keep in mind that it should be somehow in the
  2023.                      format:
  2024.  
  2025.                                 dd:mm:yy    if century is set OFF
  2026.                             or  dd:mm:yyyy  if century is set ON
  2027.  
  2028.                      The delimiters are being used the way You have
  2029.                      defined them.
  2030.  
  2031.      Notes:          If CENTURY is set ON and You post a dateformat
  2032.                      showing no century information, the function will
  2033.                      not post your date. The same goes if You set
  2034.                      CENTRY OFF and want to post a dateformat which
  2035.                      includes century information.
  2036.  
  2037.      Returns:        the current dateformat if new dateformat was
  2038.                      posted successfully, otherwise empty string
  2039.  
  2040.  
  2041.                                 DTWOY()
  2042.                                 =======
  2043.  
  2044.      Function:       DTWOY( [<expD>] ) --> integer
  2045.  
  2046.      Synopsis:       Calculates the week-of-year from a given date.
  2047.  
  2048.                      [<expD>]  a date defaults to current date
  2049.  
  2050.      Examples:       DTWOY( CTOD("11/04/91") )&& returns 45
  2051.  
  2052.      Returns:        an integer
  2053.  
  2054.                     IMPORTANT FILE FUNCTION INFORMATION
  2055.                     ===================================
  2056.  
  2057.      Not much to say about the FILE functions except again, all
  2058.      Functions are written in CLIPPER 5.01 ( unless otherwise marked )
  2059.      and not in beefed up SUMMER '87 ( pardon the pun ).
  2060.  
  2061.      Although the SUMMER '87 compiler was quite good for its time,
  2062.      there were important features missing which had to be programmed
  2063.      in a round about way ( I think all CLIPPER pro's agree with me ).
  2064.      Now the 5.01 version does a better job.
  2065.  
  2066.  
  2067.                           FIASKFILENAME()
  2068.                           ===============
  2069.  
  2070.      Function:       FiAskFilename( [<expC>], [<expN1>],;
  2071.                                     [<expN2>..<expN3>] ) --> string
  2072.  
  2073.      Synopsis:       Asks the user for a filename. The function checks
  2074.                      the validity of the fielname to comply with DOS.
  2075.                      The Function Key F2 allows the user to create a
  2076.                      valid, unique Filename. Warns the user if filename
  2077.                      alreay exists.
  2078.  
  2079.                      [<expC>]  optional box colorstring defaults to c_popcol
  2080.  
  2081.                      [<expN1>] optional box shadow position defaults
  2082.                                to c_shadpos
  2083.  
  2084.                      [<expN2>..<expN3>] optional box coordinates
  2085.                                         default to screen center.
  2086.  
  2087.      Examples:       FIASKFILENAME() returns a valid Filename
  2088.  
  2089.      Notes:          The function DOES NOT CREATE A FILE, it supplies
  2090.                      only the filename.
  2091.  
  2092.      Returns:        a string containing a valid filename.
  2093.  
  2094.                                FIBLDDBF()
  2095.                                ==========
  2096.  
  2097.      Function:       FiBldDbf( <expC1>,<expC2>|<expA> )
  2098.  
  2099.      Synopsis:       Creates a DBF from a delimited string
  2100.  
  2101.                      <expC1> name of DBF to create
  2102.  
  2103.                      <expC2> long string delimited ...
  2104.  
  2105.                      Fields must be delimited with colons, the Field
  2106.                      elements with commas
  2107.  
  2108.                      --- or ---
  2109.  
  2110.                      <expA> an array of Fields and Field elements
  2111.                             delimited with commatas
  2112.  
  2113.      Examples:       when <expC2> is a string...
  2114.  
  2115.                      FiBldDbf( "CUSTOMER","FNAME,C,30:ADDR,C,;
  2116.                                30:ZIP,N,10:CREDIT,L" )
  2117.  
  2118.                    && creates a database called CUSTOMER with 4 Fields
  2119.                         && FNAME...    Type C, Length 30
  2120.                         && ADDR ...    Type C, Length 30
  2121.                         && ZIP  ...    Type N, Length 10
  2122.                         && CREDIT  ... Type L, Length 1
  2123.  
  2124.                      when <expA> is used...
  2125.  
  2126.                      lDbStruc := {  "FNAME,C,30",;
  2127.                                     "ADDR,C,30",;
  2128.                                     "ZIP,N,10",;
  2129.                                     "CREDIT,L" }
  2130.  
  2131.                      FiBldDbf( "CUSTOMER", lDbStruc )
  2132.  
  2133.                      does the same.
  2134.  
  2135.      Notes:          FiBldDbf() expects an unused area to work in, and
  2136.                      will return .f. if it detects a DBF open in the
  2137.                      current area. An overwrite will not be allowed.
  2138.  
  2139.      Returns:        .T. if database created successfully
  2140.                      otherwise .F.
  2141.  
  2142.                                 FIINFO()
  2143.                                 ========
  2144.  
  2145.      Function:       FIINFO( <expC>, <expN> ) --> string
  2146.  
  2147.      Synopsis:       Examines a file and returns fileinfo based upon
  2148.                      passed parameters.
  2149.  
  2150.                      <expC>  filename of file to check
  2151.  
  2152.                      <expN> what to look for. These options are defined
  2153.                             in the VERTEXUS.CH file and are as follows:
  2154.  
  2155.                             FI_SIZE
  2156.                             FI_DATE
  2157.                             FI_TIME
  2158.                             FI_ATTR
  2159.  
  2160.      Examples:       filesize  = fileinfo("customer.dbf", FI_SIZE)
  2161.                         && filesize contains the size of file "customer.dbf" 
  2162.                         && as a string
  2163.  
  2164.      Returns:        a string of the wanted fileinfo
  2165.  
  2166.                               FIKEEPVAR()
  2167.                               ===========
  2168.  
  2169.      Function:       FiKeepVar( <expC1> ) --> Filename
  2170.  
  2171.      Synopsis:       Writes <expC1> to disk and returns a unique
  2172.                      Filename.
  2173.  
  2174.                      <expC1> a string of any kind.
  2175.  
  2176.                      This Function is very useful in writing saved
  2177.                      screen variables to disk for keeping them there
  2178.                      for the duration of the program so they may be
  2179.                      recalled at a later time. Allows saving quite some
  2180.                      Memory.
  2181.  
  2182.                      MEMO Fields may be exported into a file for
  2183.                      editing with an external editor.
  2184.  
  2185.                      Just remember to erase the Files. Do this by using
  2186.                      the function fitempclean() as last functioncall in
  2187.                      your program.
  2188.  
  2189.      Examples:       lScrSave := SAVESCREEN( 0,0,20,50 )
  2190.                      lFilename := FiKeepVar( lScrSave )
  2191.                         && lFilename contains a unique filename where
  2192.                         && the SAVESCREEN string was written to...
  2193.  
  2194.                      - or -
  2195.  
  2196.                      lFilename := FiKeepVar( "this string is"+;
  2197.                                              " written to disk" )
  2198.  
  2199.  
  2200.      Returns:        Filename if successfully saved, otherwise empty
  2201.                      string
  2202.  
  2203.                              FIMAKEUNIQUE()
  2204.                              ==============
  2205.  
  2206.      Function:       FiMakeUnique( [<expC1>] ) --> Filename
  2207.  
  2208.      Synopsis:       Creates a unique Filename. Checks if Filename
  2209.                      already exists and changes Filename accordingly.
  2210.  
  2211.                      <expC1> optional extension
  2212.  
  2213.                      If the optional extension is used the Filename
  2214.                      construct is:
  2215.  
  2216.                             TMP#####.___
  2217.  
  2218.                      where the underscores ( ___ ) in the Filename are
  2219.                      replaced by the extension. Otherwise the filename
  2220.                      defaults to the Filename Construct:
  2221.  
  2222.                             TMP#####.##$
  2223.  
  2224.                      where # denotes an integer in the range 0 .. 9
  2225.  
  2226.      Notes:          Use only valid extension characters for the
  2227.                      filename as no checking on validity is done.
  2228.  
  2229.      Returns:        a unique filename not existing in default
  2230.                      directory.
  2231.  
  2232.                              FITEMPCLEAN()
  2233.                              =============
  2234.  
  2235.      Function:       FiTempClean() --> NIL
  2236.  
  2237.      Synopsis:       Erases all temporary files createt by the user.
  2238.                      Requires the PUBLIC array c_tfiles to be available
  2239.                      where the names of all temporary files are stored
  2240.                      in, e.g. with Function
  2241.  
  2242.                             fikeepvar()
  2243.                             DBLOOKFOR()
  2244.  
  2245.      Notes:          Erases only the temporary files created by a
  2246.                      specific user all others are left unchanged.
  2247.  
  2248.                      Call this function as the very last thing you do
  2249.                      before leaving a program since it will erase also
  2250.                      the files in which evtl. Screen areas have been
  2251.                      saved, e.g. with Functions:
  2252.  
  2253.                      DBLOOKFOR()
  2254.                      fikeepvar()    etc.
  2255.  
  2256.                      Also, use the fitempclean() function only if these
  2257.                      above functions had been used previously or you
  2258.                      wrote manually to the array c_tfiles.
  2259.  
  2260.      Returns:        Nothing
  2261.  
  2262.                           FIVARGET()
  2263.                           ==========
  2264.  
  2265.      Function:       FiVarGet( <expC1> ) --> variable
  2266.  
  2267.      Synopsis:       Reads a temporary file in which a variable was
  2268.                      saved.
  2269.  
  2270.                      <expC1>    contains the filename into which the
  2271.                                 variable was previously save with the
  2272.                                 function FIKEEPVAR()
  2273.  
  2274.      Notice:         make sure that saved screen variable was read back
  2275.                      correctly otherwise may corrupt display.
  2276.  
  2277.      Returns:        Saved screen if successfully read, otherwise NULL
  2278.                      value
  2279.  
  2280.                   IMPORTANT GRAPHICS FUNCTION INFORMATION
  2281.                   =======================================
  2282.  
  2283.      I have supplied a view Graphics functions as a start. In general
  2284.      You do not need to link anything special in to use them. However
  2285.      be aware that You do need a Graphics Video Adapter to use these
  2286.      functions.
  2287.  
  2288.      Also, You must switch into a Graphics mode to be able to see the
  2289.      output and BEFORE your use any graphics functions.
  2290.  
  2291.      CLIPPERS ? and ?? functions don't work in Graphics mode as well as
  2292.      the DEBUGGER. I will try and expand the Graphics Library a
  2293.      little in time to give You more possibilities and will improve all
  2294.      functions so that You may use them in both TEXT and GRAPHICS
  2295.      modes.
  2296.  
  2297.                            GRBOX()
  2298.                            =======
  2299.  
  2300.      Function:       GRBOX( <expN1>..<expN5> ) --> integer
  2301.  
  2302.      Synopsis:       Draws a Graphics box on screen
  2303.  
  2304.                      The function will draw a box on a screen in
  2305.                      graphics mode a the given coordinates and returns
  2306.                      the sum of a pixels drawn.
  2307.  
  2308.                      <expN1>  TOP LEFT X coordinate
  2309.                      <expN2>  TOP LEFT Y coordinate
  2310.  
  2311.                      <expN3>  BOTTOM RIGHT X coordinate
  2312.                      <expN4>  BOTTOM RIGHT Y coordinate
  2313.  
  2314.                      <expN5>  COLOR of box
  2315.  
  2316.      Examples:       GRBOX( 100,100,600,400,3 )
  2317.  
  2318.      Notes:          Remember You are in graphics mode so all
  2319.                      coordinates are in PIXELS and NOT IN COLUMNS AND
  2320.                      ROWS.
  2321.  
  2322.                      In general:
  2323.  
  2324.                             standard CGA has 320 x 200
  2325.                             standard EGA has 640 x 350
  2326.                         and standard VGA has 640 x 480 pixels.
  2327.  
  2328.      Returns:        integer, number of pixels drawn; 0 on error
  2329.  
  2330.  
  2331.                                GRINIT()
  2332.                                ========
  2333.  
  2334.      Function:       GRINIT( <expN1>, <expN2> ) --> NIL
  2335.  
  2336.      Synopsis:       Sets maximal X,Y coordinates for Graphics Screens
  2337.  
  2338.                      Call this function whenever You want to set the
  2339.                      maximal x,y screen coordinates to any other values
  2340.                      than the ones set by the UTINIT() function.
  2341.  
  2342.                      The globals  b_maxx  and  b_maxy  are set
  2343.                      according to what Your system allows at maximum.
  2344.  
  2345.                      If Your video card supports 800 x 600 pixels, call
  2346.                      this function with:
  2347.  
  2348.                      GRINIT( 800, 600 )
  2349.  
  2350.                      setting the maximal x,y coordinates to this value
  2351.                      to benefit from the provided Graphics functions
  2352.  
  2353.      Examples:       GRINIT( 800,600 ) && set maximal x,y coordinates
  2354.                                        &&                   to 800x600
  2355.                      GRINIT( 640,480 ) &&   "   "   "          640x480
  2356.  
  2357.      Returns:        Nothing
  2358.  
  2359.                                 GRLINE()
  2360.                                 ========
  2361.  
  2362.      Function:       GRLINE( <expN1> .. <expN5> ) --> integer
  2363.  
  2364.      Synopsis:       Draw a colored line in Graphics mode.
  2365.  
  2366.                      <expN1>  starting X coordinate
  2367.  
  2368.                      <expN2>  starting Y coordinate
  2369.  
  2370.                      <expN3>  ending X coordinate
  2371.  
  2372.                      <expN4>  ending Y coordinate
  2373.  
  2374.                      <expN5>  color of line
  2375.  
  2376.                      The function will draw a line on the current
  2377.                      display page from starting X,Y coordinates to
  2378.                      ending X,Y coordinates in the specified color.
  2379.  
  2380.      Notes:          If starting X,Y and ending X,Y are the same
  2381.                      coordinates only one pixel is plotted.
  2382.  
  2383.      Returns:        integer; the number of actual pixels plotted.
  2384.  
  2385.                                GRPTREAD()
  2386.                                ==========
  2387.  
  2388.      Function:       GRPTREAD( <expN1>, <expN2> ) --> integer
  2389.  
  2390.      Synopsis:       Reads a colored pixel at X,Y coordinate and
  2391.                      returns the palette color at a given point 
  2392.  
  2393.                      <expN1> X coordinate of the point whose color to
  2394.                              read and return
  2395.  
  2396.                      <expN2> Y coordinate
  2397.  
  2398.      Examples:       lColor = GRPTREAD( 600, 300 )
  2399.                         && reads color at position 600,300 and
  2400.                         && returns a numerical color
  2401.  
  2402.      Returns:        integer
  2403.  
  2404.                               GRPTWRITE()
  2405.                               ===========
  2406.  
  2407.      Function:       GRPTWRITE( <expN1> .. <expN3> ) --> NIL
  2408.  
  2409.      Synopsis:       Writes a colored pixel at X,Y coordinate
  2410.  
  2411.                      <expN1>  X coordinate
  2412.                      <expN2>  Y coordinate
  2413.  
  2414.                      <expN3>  color of pixel
  2415.  
  2416.                      The function will write a "colored" pixel at a
  2417.                      given X,Y coordinate.
  2418.  
  2419.      Notes:          Make sure that the pixel is within the bounds of
  2420.                      the valid Screenarea ( see b_maxx and b_maxy
  2421.                      coordinates ) which You set with UTINIT() to
  2422.                      default values or using the GRINIT() function do
  2423.                      specifiy Your own.
  2424.  
  2425.      Examples:       GRPTWRITE( 100,200,3 )
  2426.  
  2427.      Returns:        Nothing
  2428.  
  2429.                IMPORTANT META FUNCTION INFORMATION
  2430.                ===================================
  2431.  
  2432.      The META Functions are something special in many ways. I have them
  2433.      included for the beginners ( or the overworked experts ) to have a
  2434.      way to quickly put together a program with all needed features to
  2435.      satisfy the customer.
  2436.  
  2437.      A META Function is a function which may stand on itself and supply
  2438.      a complete set of functionality to the user ( i.e. the
  2439.      MFDATAENTRY() function ) and could quite well be a program on its
  2440.      own.
  2441.  
  2442.      Use them if You want to, but be aware that they take away some
  2443.      space.
  2444.  
  2445.                              MFCOLORPICK()
  2446.                              =============
  2447.  
  2448.      Function:       MFCOLORPICK() --> NIL
  2449.  
  2450.      Synopsis:       A meta-function allowing the selection of colors
  2451.                      from a list
  2452.  
  2453.                      The Function gives the user the option via a menu
  2454.                      to select at present 12 pre-defined color
  2455.                      combinations which will be saved in the file
  2456.                      SYSTEM.DAT
  2457.  
  2458.                      Colors will be initialised with the SETCOLOR()
  2459.                      function
  2460.  
  2461.      Returns:        Nothing
  2462.  
  2463.                          MFDBTOOLS()
  2464.                          ===========
  2465.  
  2466.      Function:       MfDbTools( <expN1>,<expN2>,[<expA1>],[<expN3>],;
  2467.                                 [<expC2>],[<expL2>]) --> NIL
  2468.  
  2469.      Synopsis:       A Database Toolbox containing major database
  2470.                      handling functions. These functions can be
  2471.                      disabled for use by means of the third parameter
  2472.                      which requires an array of logical values.
  2473.  
  2474.                      <expN1> Coordinate, top row of toolbox window
  2475.                      <expN2> Coordinate, left side of toolbox window
  2476.                      [<expA1>]  optional array of logical values
  2477.                                 denoting if item is selectable or not:
  2478.  
  2479.                             ( .T. = selectable )
  2480.                             ( .F. = not selectable )
  2481.  
  2482.                      defaults to ALL selectable.
  2483.  
  2484.                      [<expN3>] optional parameter of windows shadow
  2485.  
  2486.                      [<expC2>] optional parameter of window color
  2487.  
  2488.                      [<expL2>] optional parameter for display windows
  2489.                                with or w/o frame
  2490.  
  2491.                      Following functions are available with this
  2492.                      toolbox:
  2493.  
  2494.                         1. Export data (in part or whole )
  2495.                         2. Import data
  2496.                         3. Shrink database ( removes deleted records )
  2497.                         4. Jump database ( selects new working database)
  2498.                         5. Zap database ( removes ALL data from database )
  2499.                         6. Interactive build index and set if desired
  2500.                         7. Print selected records
  2501.  
  2502.      Examples:       MFDBTOOLS( 5,5,{.T.,.T.,.T.,.T.,.T.,.T.,.T.} )
  2503.  
  2504.                                 && pops up the tools and all being
  2505.                      enabled
  2506.  
  2507.                      MFDBTOOLS( 5,5 )   && the same....
  2508.  
  2509.      Returns:        Nothing
  2510.  
  2511.                              MFDATAENTRY()
  2512.                              =============
  2513.  
  2514.      Function:       MfDataEntry( [<expA1> .. <expA3>] ) --> NIL
  2515.  
  2516.      Synopsis:       Allows generic Data-manipulation. Requires an open
  2517.                      database and three passed arrays. If no parameters
  2518.                      are passed, then defaults to all fields being
  2519.                      displayed and the FIELDNAMES being the field
  2520.                      descriptors. No indexes are then being used.
  2521.  
  2522.                      <expA1>    an array containing the Database-
  2523.                                 Structure of the database currently in use.
  2524.                                 Use the function DBSTRUCT() to get the
  2525.                                 required info about the structure,
  2526.                                 e.g.
  2527.  
  2528.                                 lStruct := DBSTRUCT()
  2529.  
  2530.                                 and pass the array "lStruct" as first
  2531.                                 param.
  2532.  
  2533.                      <expA2>    an array of field descriptors of the
  2534.                                 current Database.
  2535.  
  2536.                      <expA3>    an array of logical values. Any .T.
  2537.                                 value results in the field being
  2538.                                 displayed, .F. prevents the field
  2539.                                 being displayed.
  2540.  
  2541.      Example:        USE sample
  2542.                      lStruc  := DBSTRUCT()           && Structure
  2543.                      lFields := {"Field1","Field2","Field3"}
  2544.                                                      && Fielddescriptors
  2545.                      lYN  := { .T., .F., .T. }       && display ? YES/NO
  2546.                      lNtx := { "NAME","ACCOUNT" }    && 2 indexes are used
  2547.                      MfDataEntry( lStruc, lFields, lYN, lNtx ) 
  2548.                                                      && functioncall
  2549.  
  2550.                      Results in FIELDS  "Field1" and "Field3" being
  2551.                      displayed and possible to be edited. "Field2" will
  2552.                      not appear.
  2553.  
  2554.  
  2555.                      USE sample
  2556.                      MfDataEntry()
  2557.  
  2558.                      Results in ALL fields being displayed with their
  2559.                      FIELDNAMES being the descriptors.
  2560.  
  2561.      Notice:         All Functionkeys in the range F1 - F10 being SET
  2562.                      with the SETKEY() CLIPPER Function will be saved
  2563.                      and returned to their former settings. Requires a
  2564.                      database in use in the current workarea
  2565.  
  2566.      Returns:        Nothing
  2567.  
  2568.                               MFMAKEEXPR()
  2569.                               ============
  2570.  
  2571.      Function:       MfMakeExpr( <expA>, [<expC1>], [<expN1>] )
  2572.                                  --> Expression
  2573.  
  2574.      Synopsis:       Allows the interactive creation of an expression.
  2575.  
  2576.                      This expression can be used to find certain data
  2577.                      in a database, which matches the expression. An
  2578.                      array of fieldnames must be passed. There is no
  2579.                      checking if the fieldnames passed, fit the
  2580.                      database in use. So make sure that the database is
  2581.                      in use of which the fieldnames have been passed in
  2582.                      the array <expA>
  2583.  
  2584.                      <expC1> optional colorstring
  2585.  
  2586.                      <expN1> optional shadowposition
  2587.  
  2588.                      The screen will be build in a fashion of:
  2589.  
  2590.                      +--box1-------+ +--box2------+ +--box3------+
  2591.                      |             | |            | |            |
  2592.                      |             | |            | |            |
  2593.                      |             | |            | |            |
  2594.                      |             | |            | |            |
  2595.                      |             | |            | |            |
  2596.                      |             | +------------+ +------------+
  2597.                      |             | +--box4---------------------+
  2598.                      |             | |                           |
  2599.                      |             | |                           |
  2600.                      +-------------+ +---------------------------+
  2601.  
  2602.  
  2603.                      where the boxes 1 to 4 following options contain:
  2604.  
  2605.                      Box1:  all fields selectable by the user.
  2606.                      Box2:  operator used for the comparison
  2607.                      Box3:  operand used for the comparison, which can be
  2608.  
  2609.                         a) a value already existing in the database
  2610.                         b) a new value to be entered by the user.
  2611.  
  2612.                      alternatively contains .T. or .F. option when
  2613.                      selecting a field of type LOGICAL.
  2614.  
  2615.                      Box4: the spot where the new value can be entered.
  2616.  
  2617.                      Note that box 4 is only relevant if the selected
  2618.                      field is NOT of type "L" (logic).
  2619.  
  2620.                      Fields of type "M" (Memo) cannot be included in
  2621.                      the expression.
  2622.  
  2623.      Returns:        a valid expression if completed, an empty string
  2624.                      if unsuccessful
  2625.  
  2626.                              MFPICKCOLOR()
  2627.                              =============
  2628.  
  2629.      Function:       MfPickColor() --> logical value
  2630.  
  2631.      Synopsis:       pops up a selection of color-choices and stores it
  2632.                      to file SYSTEM.DAT
  2633.  
  2634.      Returns:        .T. if succesfully changed; .F. if no changes were
  2635.                      made
  2636.  
  2637.                          MFSELFILE()
  2638.                          ===========
  2639.  
  2640.      Function:       MfSelfile( [<expC>] ) --> string
  2641.  
  2642.      Synopsis:       A META function for selecting a PATH/File. Pops up
  2643.                      a window in the center of the screen allowing the
  2644.                      user to select either a file, or change a
  2645.                      directory permanently.
  2646.  
  2647.                      [<expC>]   optional three character extension to 
  2648.                                 search for. Possible extensions 
  2649.                                 currently are:
  2650.  
  2651.                                 ALL
  2652.                                 DBF
  2653.                                 NTX
  2654.                                 FRM
  2655.                                 SDF
  2656.                                 ASC
  2657.  
  2658.                      others will be added soon.
  2659.  
  2660.                      I have tried to put something together the quick
  2661.                      way for Your convenience to change a directory and
  2662.                      select a file. I know it's not the ideal thing but
  2663.                      please be free to make suggestions.
  2664.  
  2665.                      A row of buttons on the right side allow You to
  2666.                      select the type of files You want to see or select
  2667.                      in the left window. Choose the Filetype, then
  2668.                      choose the file. Push the "RETURN" button to have
  2669.                      the full filename ( w/o the path returned ).
  2670.  
  2671.      Examples:       lFile := MFSELFILE()       && to return a filename
  2672.  
  2673.                      lFile := MFSELFILE( "DBF" ) && allows selection
  2674.                                                  && of DBF files
  2675.                                                  && ONLY. Other options 
  2676.                                                  && such as
  2677.                                                  && DIR change etc. are not
  2678.                                                  && affected
  2679.  
  2680.      Returns:        a string containing the filename
  2681.  
  2682.  
  2683.                               MFSETCOLOR()
  2684.                               ============
  2685.  
  2686.      Function:       MFSETCOLOR() --> NIL
  2687.  
  2688.      Synopsis:       Development Tool for finding color combinations.
  2689.  
  2690.                      Sets the global color- and display type variables.
  2691.  
  2692.                      Several global (public) color variables are used
  2693.                      by the functions. These are:
  2694.  
  2695.                      c_normcol  -   For normal input/output
  2696.                      c_normmenu -   For normal 'menu to' operations
  2697.                      c_popcol   -   For popup box colors
  2698.                      c_popmenu  -   For popup box menus
  2699.                      c_errcol   -   For popup error boxes
  2700.                      c_frame    -   Frame string
  2701.                      c_shadatt  -   Shadow color attribute (numeric)
  2702.                      c_shadpos  -   Shadow position (0,1,3,7,9)
  2703.                      c_xplode   -   Logical - explode windows?
  2704.  
  2705.                      All are of the format "f/b,f/b,,,f/b" (f-
  2706.                      foreground b-background)
  2707.  
  2708.                      MFSETCOLOR() allows interactive setting of these
  2709.                      colors. The variables are stored in SYSTEM.DAT -
  2710.                      which is created if needed by MFSETCOLOR().
  2711.  
  2712.                      If SYSTEM.DAT is not present, UTINIT() will
  2713.                      initialise a default set of colors, otherwise it
  2714.                      will restore from SYSTEM.DAT
  2715.  
  2716.  
  2717.      Notes:          MFSETCOLOR() does not effect the current color
  2718.                      setting. It manipulates SYSTEM.DAT. To utilize
  2719.                      colors selected by MFSETCOLOR(), a restore from
  2720.                      SYSTEM.DAT must be done.
  2721.  
  2722.      Returns:        Nothing
  2723.  
  2724.                     IMPORTANT MENU FUNCTION INFORMATION
  2725.                     ===================================
  2726.  
  2727.      The Menu functions make use of other VERTEX-functions as well as
  2728.      several low level C and Assembler functions. They are fast, small
  2729.      and easy to use.
  2730.  
  2731.      Currently I have stayed away from SAA type menus as I found them
  2732.      using quite some memory and processing overhead.
  2733.  
  2734.                                MNABORT()
  2735.                                =========
  2736.  
  2737.      Function:       MNABORT( [<expC>], [<expN1>..<expN2>] ) 
  2738.                                 --> logical
  2739.  
  2740.      Synopsis:       Pops up a dialog box asking the user "ABORT?" and
  2741.                      allows to make a choice if an escape key ( ASCII
  2742.                      27 ) was pressed at a wait state.
  2743.  
  2744.                      <expC> optional characterstring of the box color
  2745.                             defaults to the globaly defined POPMENU color
  2746.  
  2747.                      <expN1> .. <expN2> optional box position where:
  2748.  
  2749.                      expN1 is the equivalent of TOP ROW and expN2 is the
  2750.                      equivalent of LEFT COLUMN
  2751.  
  2752.      Example:        INKEY(0)
  2753.                      IF MNABORT()
  2754.                         EXIT
  2755.                      ENDIF
  2756.  
  2757.      Returns:        .T. for yes; .F. for no
  2758.  
  2759.  
  2760.                                MNALERT()
  2761.                                =========
  2762.  
  2763.      Function:       MNALERT( <expC1>, <expA1> ) --> integer
  2764.  
  2765.      Synopsis:       A popup dialog-box with more than 2 choices
  2766.                      displayed centered.
  2767.  
  2768.                      <expC1> Expression to be displayed as question.
  2769.  
  2770.                      <expA1> answers
  2771.  
  2772.  
  2773.      Examples:       lChoice := mnalert( "Are you ready", 10, 10,;
  2774.                                         { "Yes!", "Not yet", "Almost" } )
  2775.                      DO CASE
  2776.                         CASE lChoice == 1  && yes
  2777.                             ... your code ...
  2778.  
  2779.                         CASE lChoice == 2  && not yet
  2780.                             ... your code ...
  2781.  
  2782.                         CASE lChoice == 3  && almost
  2783.                             ... your code ...
  2784.  
  2785.                         OTHERWISE && ESC
  2786.                      ENDCASE
  2787.  
  2788.      Returns:        an integer identifying the selected option; 0 on
  2789.                      error or if no selection
  2790.  
  2791.                                MNCHOICE()
  2792.                                ==========
  2793.  
  2794.      Function:       MNCHOICE(  <expA>, <expN1>..<expN4>, [<expC1>],;
  2795.                                [<expL>], [<expC2>], [<expN5>] ) --> integer
  2796.  
  2797.      Synopsis:       The equivalent of CLIPPER's ACHOICE() function
  2798.                      however it also creates a box for it with an
  2799.                      optional heading and restores the underlying
  2800.                      screen after selection.
  2801.  
  2802.                      <expA>     an array of choices.
  2803.  
  2804.                      <expN1>..<expN4> location of choice box.
  2805.  
  2806.                      [<expC1>]  optional boxtitle
  2807.  
  2808.                      [<expL>]   optional execute flag defaults to .F.
  2809.                                 - if set to .T., this function will
  2810.                                 execute a return on a first letter match.
  2811.  
  2812.                      [<expC2>]  optional boxcolor defaults to C_POPCOL
  2813.  
  2814.                      [<expN5>]  optional boxshadow position defaults
  2815.                                 to C_SHADPOS
  2816.  
  2817.      Examples:       MyArray := { "Apples", "Pears", "Bananas" }
  2818.                      lChoice := MNCHOICE( MyArray,Top,Left,Bottom,Right,;
  2819.                                           "Fruits",.T.)
  2820.  
  2821.      Returns:        an integer identifying the selected array element.
  2822.                      0 for no selection
  2823.  
  2824.                           MNFIELDS()
  2825.                           ==========
  2826.  
  2827.      Function:       MNFIELDS(  [<expC1>],[<expN1>..<expN4>], [<expL>],
  2828.                                 [<expC2>],[<expN5>] ) --> string|integer
  2829.  
  2830.      Synopsis:       pops up a box to allow selection of fields of
  2831.                      current database.
  2832.  
  2833.                      [<expC1>]  optional title of box.
  2834.  
  2835.                      [<expN1>..<expN4>] optional box coordinates
  2836.                                         default to screen center.
  2837.  
  2838.                      [<expL>]   optional returnvalue selector. If set
  2839.                                 to .T. returns selected FIELDNAME, if 
  2840.                                 set to .F. returns the  FIELDPOSITION 
  2841.                                 of the selected field;
  2842.                                 defaults to .T.
  2843.  
  2844.                      [<expC2>]  optional box colorstring defaults to
  2845.                                 c_popcol
  2846.  
  2847.                      [<expN5>]  optional box shadowposition defaults
  2848.                                 to c_shadpos
  2849.  
  2850.      Notes:          Do not confuse this function with the
  2851.                      MNTAKEFIELD() function. MNFIELDS() examines the
  2852.                      current database and returns the fieldname or the
  2853.                      fieldposition depending upon the 5th parameter
  2854.                      set, whereas MNTAKEFIELD() relies upon the
  2855.                      fieldnames passed as an array and does not need an
  2856.                      open database.
  2857.  
  2858.      Returns:        if parameter 5 is set to .T. --> selected fieldname
  2859.                      if parameter 5 is set to .F. --> FIELDPOSITION within 
  2860.                                                       current database of 
  2861.                                                       selected Field
  2862.  
  2863.                                 MNINFO()
  2864.                                 ========
  2865.  
  2866.      Function:       MNINFO( <expC1>,<expN1>,<expA1> )  --> string
  2867.  
  2868.      Synopsis:       Displays a popup box with up to as many lines of a
  2869.                      messages, that fit on the screen, NOT waiting for
  2870.                      a Keypress.
  2871.  
  2872.                      The amount that will fit on the screen will be
  2873.                      calculated out of:
  2874.  
  2875.                         maximum number of displayable rows - 6
  2876.  
  2877.                      The maximum width that will be displayed is:
  2878.  
  2879.                         maximum number of displayable columns - 6
  2880.  
  2881.                      The message remains until removed with UNBOX()
  2882.  
  2883.                      <expC1> message box color string defaults to
  2884.                              C_POPCOL
  2885.  
  2886.                      <expN1> position of the box-shadow defaults to
  2887.                              C_SHADPOS
  2888.  
  2889.                      <expA1> an array of messages
  2890.  
  2891.      Examples:       MNMSG(,,{ "An error has been detected!" })
  2892.                      MNMSG(,,{ "A","B","C","D","E","F" })
  2893.  
  2894.      Notes:          The message is centered on screen in a box.
  2895.  
  2896.      Returns:        underlying screen in string.
  2897.                      Nothing on error.
  2898.  
  2899.                                 MNMENU()
  2900.  
  2901.  
  2902.      Function:       MNMENU( <expC1>..<expC3>,[<expC4>..<expC16>]) 
  2903.                                 --> integer
  2904.  
  2905.      Synopsis:       A vertical popup menu in a centered box using
  2906.                      <expC1> as title and performing a MENU TO ... on
  2907.                      <expC2> to <expC16> where <expC1> may be passed as
  2908.                      empty string for a popup menu w/out a title.
  2909.  
  2910.      Examples:       lChoice := mnmenu("Selection","Edit","Add",;
  2911.                                        "Delete","Quit")
  2912.  
  2913.      Returns:        an integer representing the position of the
  2914.                      selected item. 0 (zero) of nothing was selected.
  2915.  
  2916.                                 MNMSG()
  2917.                                 =======
  2918.  
  2919.      Function:       MNMSG(<expC1>,<expN1>,<expC2>|<expN2>,;
  2920.                              [<expC3>..<expC10>]) --> NIL
  2921.  
  2922.      Synopsis:       Displays a popup box with up to 9 lines of a
  2923.                      message, waiting then for a Keypress or optionally
  2924.                      a time-out.
  2925.  
  2926.                      <expC1> message box color string defaults to
  2927.                              C_POPCOL
  2928.  
  2929.                      <expN1> message box shadow position defaults to 3
  2930.                              (bottom right )
  2931.  
  2932.                      <expC2>|<expN1>
  2933.                      a message string or a numeric value. If this
  2934.                      parameter is a messagestring, than the message
  2935.                      will be displayed as the first message line within
  2936.                      the message box; however if this parameter is of a
  2937.                      numeric value, than the function will see it as
  2938.                      the optional timeout value after which the box
  2939.                      will be automatically removed from the screen -
  2940.                      otherwise the box will remain until a further key
  2941.                      is pressed.
  2942.  
  2943.                      [<exp3>..<expC10>] optional further message
  2944.                                         strings.
  2945.  
  2946.      Examples:       MNMSG(,,"An error has been detected!")
  2947.                      MNMSG(,,"A","B","C","D","E","F")
  2948.                      MNMSG(,,5,"A","B","C","D","E","F")  && removed
  2949.                                                          && after 5 seconds
  2950.  
  2951.      Notes:          The message is centered on screen in a box. Once
  2952.                      the message is displayed, the function waits for a
  2953.                      keypress and then removes the window, restoring
  2954.                      screen underneath, or waits for time-out value
  2955.                      defined as 3rd parameter.
  2956.  
  2957.      Returns:        Nothing
  2958.  
  2959.                                MNMESSYN()
  2960.                                ==========
  2961.  
  2962.      Function:       MNMESSYN( <expC1>, [<expC2>,<expC3>] ) --> logical
  2963.  
  2964.      Synopsis:       A popup YESNO dialog-box.
  2965.  
  2966.                      <expC1> Expression to be displayed as question.
  2967.  
  2968.                      [<expC2>,<expC3>] optional answers defaults to
  2969.                                        YES/NO
  2970.  
  2971.  
  2972.      Examples:       if messyn("Are you ready")
  2973.                      if messyn("Are you ready","Not Yet","Almost")
  2974.  
  2975.      Returns:        .T. if first answer (leftmost) was selected,
  2976.                      .F. if right answer (rightmost) was selected.
  2977.  
  2978.                                MNPULLDN()
  2979.                                ==========
  2980.  
  2981.      Function:       MNPULLDN( <expN1>, <expA1>..<expA3> ) --> float
  2982.  
  2983.      Synopsis:       Pulldown Menu creator and handler. Draws a
  2984.                      pulldown menu with up to 8 menu boxes. selection
  2985.                      process starts with position passed with <expN1>.
  2986.  
  2987.                      <expN1>    a floating point number representing
  2988.                                 the start of the menu process, i.e. 1.01
  2989.                                 starts with 1st Menu, 1st Menu option
  2990.  
  2991.                      <expA1> .. <expA3>  three arrays
  2992.  
  2993.                      <expA1>    each element defines the Menu. A Menu
  2994.                                 definition is a String delimited
  2995.                                 with colons for each Menuoption.
  2996.  
  2997.                      Example:   "TITLE:option:option:option..."
  2998.  
  2999.                             with up to 99 options per string.
  3000.  
  3001.                      <expA2>    is a box definition array. It is 7
  3002.                                 elements long and defines the following:
  3003.  
  3004.                      Element: 1. <expL> Draw top bar box? T/F
  3005.                               2. <expC> Top bar color
  3006.                               3. <expC> Menu Box color
  3007.                               4. <expC> Menu Box frame
  3008.                               5. <expN> Menu Box shadow position (0,1,3,7,9)
  3009.                               6. <expN> Menu Box shadow attribute
  3010.                               7. <expN> Row to start menu bar
  3011.  
  3012.                      <expA3>    is an array of title column positions
  3013.                                 to override the internal 'figerin algorithm.
  3014.  
  3015.      Examples:       #include "vertex.ch"
  3016.  
  3017.                      Box := {   "Datafiles:Use Datafile",;
  3018.                                 "Indices:Select Indices:Index order",;
  3019.                                 "Editing:Field Replacement:Tabular Edit",;
  3020.                                 "Reporting:Build Query:Print Lists",;
  3021.                                 "Other:List text file:Change Directory",;
  3022.                                 "Quit" }
  3023.  
  3024.                      BoxSel := 1.01
  3025.  
  3026.                      BoxData := {   .T.,;          && draw the top bar box
  3027.                                 "W/B,GR/R,,,W/N",; && top bar color string
  3028.                                 "W/B,N/R,,,W/N",;  && drop box color
  3029.                                 VERTEX_SSSS,;      && drop box frame
  3030.                                 3,;                && drop box shadowposition
  3031.                                 8,;                && drop box shadowattribute
  3032.                                 0 }                && row # of menu bar
  3033.  
  3034.                 DO WHILE .T.
  3035.                         BoxSel := MNPULLDN( BoxSel, Box, BoxData )
  3036.                         DO CASE
  3037.                             case BoxSel == 1.01 && Datafiles -> Use...
  3038.                                 .......
  3039.                             case BoxSel == 2.01 && Indices -> Select...
  3040.                             case BoxSel == 2.02 && Indices -> Index order...
  3041.                             case BoxSel == 3.01
  3042.                             case BoxSel == 5.01
  3043.                         ENDCASE
  3044.                      ENDDO
  3045.                      Passing a menu array element with title only will
  3046.                      result in no menu box, with the title being the
  3047.                      only selection and returning a selection value of
  3048.                      <MENU>.1. (i.e. a 'Quit' box)
  3049.  
  3050.      Warnings:       It takes some work to start all options and titles
  3051.                      with a first letter that is unique so that first
  3052.                      letter selection may take place.
  3053.  
  3054.      Returns:        float number to identify relative position of
  3055.                      chosen menu-option where the whole numerical part
  3056.                      identifies the master menu and the fraction the
  3057.                      sub menu.
  3058.  
  3059.                              MNTAKEFIELD()
  3060.                              =============
  3061.  
  3062.      Function:       MnTakeField( <expA>,[<expN1>..<expN4>],[<expC>],
  3063.                                   [<expN5>], [<expL>]) --> Fieldname
  3064.  
  3065.      Synopsis:       Accepts an Array of Fieldnames and displays it for
  3066.                      serselection at coordinates <expN1> to <expN4>.
  3067.  
  3068.                      <expA> array of fieldnames
  3069.  
  3070.                      [<expN1>..<expN4>] optional coordinates of box
  3071.                                         default is center
  3072.  
  3073.                      [<expC>]   optional box colorstring defaults to
  3074.                                 C_POPCOL
  3075.  
  3076.                      [<expN5>]  optional box shadow position defaults
  3077.                                 to C_SHADPOS
  3078.  
  3079.                      [<expL>]   optional execute flag defaults to .F.
  3080.                                 - if set to .T., this function will
  3081.                                 execute a return on a first letter match.
  3082.  
  3083.      Examples:       lFields := { "Name", "Address", "City" }
  3084.                      lChoice := MNTAKEFIELD( lFields,top,left,bott,right )
  3085.  
  3086.                      - or -
  3087.  
  3088.                      lFields := { "Name", "Address", "City" }
  3089.                      lChoice := MNTAKEFIELD( lFields, top, left, bott, right,;
  3090.                                              M->color, M->shadow, .T.)
  3091.  
  3092.  
  3093.      Returns:        FIELDNAME if one was chosen,
  3094.                      Empty string if none was chosen.
  3095.  
  3096.                     IMPORTANT MATH FUNCTION INFORMATION
  3097.                     ===================================
  3098.  
  3099.      The Math functions provided are using wherever available a Math-
  3100.      Coprocessor.
  3101.  
  3102.      Some functions are however simply adding elements which make use
  3103.      of codeblocks to speed up the adding process. These however don't
  3104.      use a Co-Processor.
  3105.  
  3106.      Functions which are using a Co-Processor (whenever there is one
  3107.      available) have been identified as such.
  3108.  
  3109.                              MTARAVERAGE()
  3110.                              =============
  3111.  
  3112.      Function:       MTARAVERAGE( <expA1> ) --> float
  3113.  
  3114.      Synopsis:       Gets the average of all numbers in an array. There
  3115.                      can be any types of elements within the array as
  3116.                      the function only calculates the average of
  3117.                      elements which are of type NUMERIC.
  3118.  
  3119.                      <expA1> the array to scan
  3120.  
  3121.      Examples:       lArray := { "just for fun", 12, 200, 11.6, 97.12, .T. }
  3122.                      lResult := MTARAVERAGE( lArray )
  3123.  
  3124.                         && lResult contains 80.18 as average
  3125.  
  3126.      Returns:        a float containing the average of all NUMERIC elements
  3127.                      0 if no NUMERIC elements found or on Error.
  3128.  
  3129.                                MTARSUM()
  3130.                                =========
  3131.  
  3132.      Function:       MTARSUM( <expA1> ) --> float
  3133.  
  3134.      Synopsis:       Sums a numeric array.
  3135.  
  3136.                      <expA1> numerical array to sum
  3137.  
  3138.      Examples:       lArray := { 10, 11, 1, 2 }
  3139.                      lTotal := MTARSUM( lArray ) && lTotal contains 24
  3140.  
  3141.      Returns:        a float containing the sum of the array passed,
  3142.                      on Error NIL
  3143.  
  3144.                              MTDBAVERAGE()
  3145.                              =============
  3146.  
  3147.      Function:       MTDBAVERAGE( <expC1>|<expN1>, <expN2> ) --> float
  3148.  
  3149.      Synopsis:       Gets the average of all numbers in a Field
  3150.                      identified by <expC1> or <expN1>.
  3151.  
  3152.                      Expects an open database in the current Workarea.
  3153.  
  3154.                      <expC1>    the name of the field to average or
  3155.  
  3156.                      <expN1>    the fieldnumber to average
  3157.  
  3158.                      <expN2> Type 0 =  averages all records incl. deleted,
  3159.                              Type 1 =  averages only deleted records,
  3160.                              Type 2 =  averages all BUT deleted records.
  3161.  
  3162.      Examples:       lResult := MTDBAVERAGE( 1, 0 )
  3163.                         && lResult contains the average of Field 1 
  3164.                         && ALL records
  3165.  
  3166.                      lResult := MTDBAVERAGE( "INCOME", 1 )
  3167.                         && lResult contains the average of the Field 
  3168.                         && "INCOME" only deleted records
  3169.  
  3170.                      lResult := MTDBAVERAGE( "PAYMENTS", 2 )
  3171.                         && lResult contains the average of the Field 
  3172.                         && "INCOME" all BUT deleted records
  3173.  
  3174.      Returns:        a float containing the average of the Field
  3175.                      0 if no values in Database or on Error.
  3176.  
  3177.                          MTDBFLDSUM()
  3178.                          ============
  3179.  
  3180.      Function:       MTDBFLDSUM( <expC1>|<expN1> ) --> float
  3181.  
  3182.      Synopsis:       Sum a Field of a database currently in use.
  3183.  
  3184.                      The function is adding up all values of a database
  3185.                      field either identified by NAME or FIELDPOSITION.
  3186.  
  3187.                      <expC1>  name of databasefield to sum
  3188.  
  3189.                      <expN1>  fieldposition of databasefield to sum
  3190.  
  3191.  
  3192.      Examples:       USE ACCOUNTS
  3193.                      lTotal := MTDBFLDSUM( 2 )
  3194.  
  3195.                       - or -
  3196.  
  3197.                      lTotal := MTDBFLDSUM( "PAYMENT" )
  3198.  
  3199.                      both do the same and return the same value.
  3200.  
  3201.      Returns:        a float number representing the TOTAL of the Field.
  3202.                      0 on error
  3203.  
  3204.                               MTDEC2HEX()
  3205.                               ===========
  3206.  
  3207.      Function:       MTDEC2HEX( <expN1> ) --> string
  3208.  
  3209.      Synopsis:       Converts an Integer into a hexadecimal string.
  3210.  
  3211.                      The function accepts an integer and converts it
  3212.                      into a hexadecimal string .
  3213.  
  3214.                      <expN1> Integer to convert
  3215.  
  3216.      Returns:        a string representing the integer, empty string if
  3217.                      wrong parameter was passed.
  3218.  
  3219.                          MTHEX2DEC()
  3220.                          ===========
  3221.  
  3222.      Function:       MTHEX2DEC( <expC1> ) --> integer
  3223.  
  3224.      Synopsis:       Converts hexadecimal string into an Integer.
  3225.  
  3226.                      The function accepts a hexadecimal string and
  3227.                      converts it into an integer.
  3228.  
  3229.                      <expC1> hexadecimal string to convert
  3230.  
  3231.      Notes:          Don't pass the "H" which usually is used to
  3232.                      identify a HEX number.
  3233.  
  3234.      Examples:       MTHEX2DEC( "29" )  && returns 41
  3235.                      MTHEX2DEC( "29h" ) && returns NIL
  3236.  
  3237.                      MTHEX2DEC( "A0A" ) && returns 2570
  3238.  
  3239.      Returns:        an integer equivalent of the hexadecimal string,
  3240.                      NIL if wrong parameter was passed.
  3241.  
  3242.                     IMPORTANT INDEX FUNCTION INFORMATION
  3243.                     ====================================
  3244.  
  3245.      The Indexfunctions are primarily used to provide an easy interface
  3246.      to create and handle CLIPPER and DBASE indexes.
  3247.  
  3248.      Some functions have the functionality of META functions and give
  3249.      the user quite some control over the happenings.
  3250.  
  3251.                               NXISVALID()
  3252.                               ===========
  3253.  
  3254.      Function:       NXisvalid( <expC> ) --> logical
  3255.  
  3256.      Synopsis:       Checks if index-expression is valid for database
  3257.                      in current workarea
  3258.  
  3259.                      Requires an open Database in the current workarea.
  3260.  
  3261.      Returns:        .T. if index-expression is valid,
  3262.                      otherwise .F.
  3263.  
  3264.                               NXINDEXKEY()
  3265.                               ============
  3266.  
  3267.      Function:       NXINDEXKEY( <expC>, <expN> ) --> string
  3268.  
  3269.      Synopsis:       Extracts the key-expression of an index. Is
  3270.                      sensitive to DBase III or Clipper generated
  3271.                      indexes.
  3272.  
  3273.                      <expC> name of index
  3274.  
  3275.                      <expN> index type. There are two different types
  3276.                             of indexes ( sofar ) usable with CLIPPER:
  3277.  
  3278.                                     Type1 = CLIPPER NTX format
  3279.                                     Type2 = DBase III NDX format
  3280.  
  3281.      Returns:        index key-expression if sucessfully read,
  3282.                      empty string if no expression found, i.e. invalid
  3283.                      file
  3284.  
  3285.                                 NXSCAN()
  3286.                                 ========
  3287.  
  3288.      Function:       Nxscan( [<expC>] ) --> array
  3289.  
  3290.      Synopsis:       Scans a workarea for indexes.
  3291.  
  3292.                      [<expC>] optional workarea name defaults to
  3293.                               current workarea.
  3294.  
  3295.                      a workarea is scanned for open indexes. If a
  3296.                      workarea is passed as parameter, it will be
  3297.                      scanned for all open indexes, otherwise the
  3298.                      current workarea will be scanned. All open indexes
  3299.                      are written into an array.
  3300.  
  3301.      Examples:       allindexes := {}
  3302.                      allindexes := nxscan( ALIAS() ) && scans current
  3303.                                                      && workarea
  3304.  
  3305.                      -or-
  3306.  
  3307.                      allindex := nxscan()       && scans current workarea
  3308.  
  3309.                      -or-
  3310.  
  3311.                      allindex := nxscan( "NEWAREA" ) && scans workarea
  3312.                                                      && "NEWAREA"
  3313.  
  3314.                      -or-
  3315.  
  3316.                      AREA := "OTHERS"
  3317.                      allindex := nxscan( AREA ) && scans workarea "OTHERS"
  3318.  
  3319.      Returns:        array containing open indexes
  3320.                      empty array if no index found
  3321.  
  3322.                           NXDBSEEK()
  3323.                           ==========
  3324.  
  3325.      Function:       NxDbSeek( [<expL>] ) --> integer
  3326.  
  3327.      Synopsis:       Seeks a record in the current workarea.
  3328.  
  3329.                      [<expL>]   optional setting for Softseek on or
  3330.                                 off; defaults to .F. where:
  3331.  
  3332.                                 .F. = SOFTSEEK OFF
  3333.                                 .T. = SOFTSEEK ON
  3334.  
  3335.                      The function will seek a record in the current
  3336.                      workarea using the controlling index. Depending
  3337.                      upon the Indexkey, the user is required to enter
  3338.                      values of the fields containedin the index and in
  3339.                      the sequence appearing in the Index.
  3340.  
  3341.      Notes:          Softseek is used, irrespective of overall
  3342.                      settings, according to [<expL>].
  3343.  
  3344.      Examples:       INDEX ON SURNAME+FNAME TO NAMES
  3345.                      SET INDEX TO NAMES
  3346.                      lRecFound := NxDBSeek( .T. )
  3347.  
  3348.                         && seeks a record using the index "NAMES" - Softseek
  3349.                         && is set ON - the function requests input for FIELDS
  3350.                         && SURNAME and FNAME
  3351.  
  3352.      Returns:        a recordnumber if SEEK was successful,
  3353.                      otherwise 0
  3354.  
  3355.                                NXSELECT()
  3356.                                ==========
  3357.  
  3358.      Function:       NxSelect( [<expN1>], [<expC>], [<expN2>] ) 
  3359.                                 --> logical
  3360.  
  3361.      Synopsis:       Allows the setting of indexes in the current
  3362.                      workarea
  3363.  
  3364.                      [<expN1>]  a numeric value of the controlling                                
  3365.                                 index ( 0 - 15 ) where 0 sets the
  3366.                                 controlling index off so that the
  3367.                                 database can be accessed in its
  3368.                                 natural order.
  3369.  
  3370.                      [<expC>]   optional colorsetting of selection box
  3371.                                 default to c_popcol
  3372.  
  3373.                      [<expN2>]  option box-shadow position default to
  3374.                                 c_shadpos
  3375.  
  3376.                      if the parameter <expN> is not passed, then the
  3377.                      function will scan the current workarea for open
  3378.                      indexes and allows interactive setting of the
  3379.                      controlling index.
  3380.  
  3381.      Notes:          Requires an open database in the current workarea
  3382.  
  3383.      Examples:       NxSelect( 2 )  && sets indexorder to 2
  3384.  
  3385.                      - or -
  3386.  
  3387.                      NxSelect()     && pops up a choice of available indexes
  3388.                                     && and allows interactive setting of the
  3389.                                     && indexorder
  3390.  
  3391.      Returns:        .T. if successful; .F. if unsuccessful
  3392.  
  3393.                     IMPORTANT PRINT FUNCTION INFORMATION
  3394.                     ====================================
  3395.  
  3396.      The provided printfunctions give You support in printing records
  3397.      of a database by making use of existing QUERY sets created with
  3398.      the MFMAKEEXPR() function.
  3399.  
  3400.  
  3401.                                PROUTPUT()
  3402.                                ==========
  3403.  
  3404.      Function:       PROutput( <expC> | <expA> )  --> NIL
  3405.  
  3406.      Synopsis:       Prints the contents of a database while using a
  3407.                      report form passed as parameter <expC>. Requires
  3408.                      an open database in the current workarea.
  3409.  
  3410.                      To use this function best, copy first of all the
  3411.                      records You want to have included in the report
  3412.                      into a seperate database and use it temporarily.
  3413.                      This is the faster way of selecting records You
  3414.                      want to print.
  3415.  
  3416.                      The function will than give You a progressing
  3417.                      report by means of a counter on how many records
  3418.                      still to go.
  3419.  
  3420.                      <expC> name of reportform to be used. If the DOS
  3421.                      extender .FRM is not being
  3422.                      used, it is assumed.
  3423.  
  3424.                      - or -
  3425.  
  3426.                      <expA> array of setup information 10 elements
  3427.  
  3428.                      The function requires the user to set certain
  3429.                      parameters. These are:
  3430.  
  3431.                             a)  output to PRINTER or FILE
  3432.                             b)  WITHOUT or WITH ECHO while printing
  3433.                             c)  PLAIN or WITH HEADING
  3434.                             d)  FIRST PAGE EJECT
  3435.                             e)  FULL REPORT or only SUMMARY
  3436.  
  3437.                      All these parameters may already be set by passing
  3438.                      the required values together with the reportform
  3439.                      name in an array of 10 elements as the parameter.
  3440.                      The Setup of this array should be:
  3441.  
  3442.                             {   <expAC1>,;
  3443.                                 <expAL1>,;
  3444.                                 <expAL2>,;
  3445.                                 <expAL3>,;
  3446.                                 <expAL4>,;
  3447.                                 <expAL5>,;
  3448.                                 <expAL6>,;
  3449.                                 <expAL7>,;
  3450.                                 <expAL8>,;
  3451.                                 <expAL9> }
  3452.  
  3453.                      where the single elements represent following:
  3454.  
  3455.                      <expAC1>   name of report form
  3456.  
  3457.                      <expAL1>   .T. to Printer, .F. to File,
  3458.  
  3459.                      <expAL2>   .T. without Screen Echo, .F. with
  3460.                                 Screen Echo
  3461.  
  3462.                      <expAL3>   .T. Plain, .F. with Heading
  3463.  
  3464.                      <expAL4>   .T. first page eject, .F. no first page eject
  3465.  
  3466.                      <expAL5>   .T. full report, .F. only summary
  3467.  
  3468.                      <expAC2>   Heading string to be used if <expAL3>
  3469.                                 is set to .F. (printing with
  3470.                                 heading). Note: Will be ignored if <expAL3>
  3471.                                 is set to value .T.
  3472.  
  3473.                      [<expAN1>] an optional integer identifying the
  3474.                                 recordnumber of a single record
  3475.                                 to be printed. Note: [<expAN2>] will be
  3476.                                 ignored if anything is in this element.
  3477.  
  3478.                      [<expAN2>] an optional integer identifying the
  3479.                                 next "n" - amount of records
  3480.                                 to be printed. Note: [<expAN1>] will be
  3481.                                 ignored if anything is in this element.
  3482.  
  3483.                      [<expAL6>] optional logical value to determine if
  3484.                                 all records are to be processed
  3485.                                 or only the REST ( from current
  3486.                                 position to end of file ). .T. if
  3487.                                 printing the REST, .F. to print all
  3488.                      Note:      Both [<expAN1>] and [<expAN2>] will be ignored
  3489.                                 if anything is in this element.
  3490.  
  3491.  
  3492.  
  3493.  
  3494.  
  3495.  
  3496.      Notes:          Using only a formname when calling the function
  3497.                      has the same result as using a parameter-array
  3498.                      with following settings:
  3499.  
  3500.                                 { "< formname >",;  && <- Formname
  3501.                                   .T.,;             && <- output to printer
  3502.                                   .T.,;             && <- no echo
  3503.                                   .T.,;             && <- plain
  3504.                                   .T.,;             && <- eject first page
  3505.                                   .T.,;             && <- full report
  3506.                                   NIL;              && <- heading
  3507.                                   NIL,;             && <- single recordnumber
  3508.                                                     && to print
  3509.                                   NIL,;             && <- next n-records to print
  3510.                                   .F.,;             && <- print all records
  3511.                                   }
  3512.  
  3513.                      Make sure all Elements which are not used contain
  3514.                      a NIL value.
  3515.  
  3516.      Examples:       proutput( "MYFORM" )    && prints using MYFORM.FRM
  3517.                                              && and defaults
  3518.  
  3519.                      - or -
  3520.  
  3521.                      //-----------------------------------------------
  3522.                         This array-setup will:
  3523.  
  3524.                         a) use form "MYFORM.FRM"
  3525.                         b) output to printer
  3526.                         c) give no echo to screen
  3527.                         d) uses default headings, thus ignoring the
  3528.                            header written into element 7.
  3529.                         e) eject the first page
  3530.                         f) do a FULL report
  3531.                         g) output all records in database
  3532.  
  3533.                      prnArray := {  "MYFORM",       && <- Formname
  3534.                                 .T.,;               && <- output to printer
  3535.                                 .T.,;               && <- no echo
  3536.                                 .T.,;               && <- plain
  3537.                                 .T.,;               && <- eject first page
  3538.                                 .T.,;               && <- full report
  3539.                                 "Headings";         && <- will be ignored this
  3540.                                                     && time!!!!
  3541.                                 NIL,;               && <- single recordnumber
  3542.                                                     && to print
  3543.                                 NIL,;               && <- next n- records to print
  3544.                                 .F.,;               && <- print some or all
  3545.                                                     && records
  3546.                                     } )
  3547.  
  3548.  
  3549.  
  3550.  
  3551.                  - or -
  3552.  
  3553.                      //---------------------------------------------------
  3554.                         This array-setup will:
  3555.  
  3556.                         a) use form "MYFORM.FRM"
  3557.                         b) output to File. The Function will ask for a
  3558.                            filename and will use it as output file.
  3559.                         c) give no echo to screen
  3560.                         d) uses the header written into element 7.
  3561.                         e) eject the first page
  3562.                         f) do a FULL report
  3563.                         g) output all records in database
  3564.  
  3565.                         prnArray := {   "MYFORM",   && <- Formname
  3566.                                     .F.,;           && <- output to File
  3567.                                     .T.,;           && <- no echo
  3568.                                     .F.,;           && <- with heading
  3569.                                     .T.,;           && <- eject first page
  3570.                                     .T.,;           && <- full report
  3571.                                     "Headings";     && <- will be used this
  3572.                                                     && time!!!!
  3573.                                     NIL,;           && <- single recordnumber
  3574.                                                     && to print
  3575.                                     NIL,;           && <- next n- records to print
  3576.                                     .F.,;           && <- print some or all
  3577.                                                     && records
  3578.                                         } )
  3579.  
  3580.                      - or -
  3581.  
  3582.                      //-----------------------------------------------------
  3583.                         This array-setup will:
  3584.  
  3585.                         a) use form "MYFORM.FRM"
  3586.                         b) output to printer
  3587.                         c) give no echo to screen
  3588.                         d) uses default headings, thus ignoring the
  3589.                            header written into element 7.
  3590.                         e) eject the first page
  3591.                         f) do a FULL report
  3592.                         g) output ONLY the RECORD 1 as identified.
  3593.  
  3594.                         prnArray := {   "MYFORM",   && <- Formname
  3595.                                     .T.,;           && <- output to printer
  3596.                                     .T.,;           && <- no echo
  3597.                                     .T.,;           && <- plain
  3598.                                     .T.,;           && <- eject first page
  3599.                                     .T.,;           && <- full report
  3600.                                "Headings";          && <- will be ignored 
  3601.                                                     & this time!!!!
  3602.                                     1,;             && <- single recordnumber
  3603.                                                     && to print
  3604.                                     NIL,;           && <- next n- records to print
  3605.                                     .F.,;           && <- print some or all
  3606.                                                     && records
  3607.                                         } )
  3608.  
  3609.  
  3610.                 - or -
  3611.  
  3612.                      //-------------------------------------------------------
  3613.                         This array-setup will:
  3614.  
  3615.                         a) use form "MYFORM.FRM"
  3616.                         b) output to printer
  3617.                         c) give no echo to screen
  3618.                         d) uses default headings, thus ignoring the
  3619.                            header written into element 7.
  3620.                         e) eject the first page
  3621.                         f) do a FULL report
  3622.                         g) outputs the NEXT 200 RECORDS
  3623.  
  3624.                         prnArray := {   "MYFORM",   && <- Formname
  3625.                                     .T.,;           && <- output to printer
  3626.                                     .T.,;           && <- no echo
  3627.                                     .T.,;           && <- plain
  3628.                                     .T.,;           && <- eject first page
  3629.                                     .T.,;           && <- full report
  3630.                                     "Headings";     && <- will be ignored this
  3631.                                                     && time!!!!
  3632.                                     NIL,;           && <- single recordnumber
  3633.                                                     && to print
  3634.                                     200,;           && <- next n-records to print
  3635.                                     .F.,;           && <- print some or all
  3636.                                                     && records
  3637.                                         } )
  3638.                      - or -
  3639.  
  3640.                      //-------------------------------------------------
  3641.                         This array-setup will:
  3642.  
  3643.                      a) use form "MYFORM.FRM"
  3644.                      b) output to printer
  3645.                      c) give no echo to screen
  3646.                      d) uses default headings, thus ignoring the header
  3647.                         written into element 7.
  3648.                      e) eject the first page
  3649.                      f) do a FULL report
  3650.                      g) output the REST of the records in the Database
  3651.                         relative to the recordpointer position.
  3652.  
  3653.                      prnArray := {  "MYFORM",   && <- Formname
  3654.                                 .T.,;           && <- output to printer
  3655.                                 .T.,;           && <- no echo
  3656.                                 .T.,;           && <- plain
  3657.                                 .T.,;           && <- eject first page
  3658.                                 .T.,;           && <- full report
  3659.                                 "Headings";     && <- will be ignored this
  3660.                                                 && time!!!!
  3661.                                 NIL,;           && <- single recordnumber to print
  3662.                                 NIL,;           && <- next n-records to print
  3663.                                 .T.,;           && <- print the rest
  3664.                                     } )
  3665.  
  3666.                      proutput( prnArray )  && uses the defined array
  3667.                      for parameters
  3668.      Returns:        .T. if print was successful; otherwise .F.
  3669.  
  3670.  
  3671.  
  3672.                    IMPORTANT STRING FUNCTION INFORMATION
  3673.                    =====================================
  3674.  
  3675.      Although CLIPPER provides String functions I have endeavored to
  3676.      provide You with some functions giving You more control over the
  3677.      handling.
  3678.  
  3679.      Some functions make use of low level C functions for speeding
  3680.      things up. They are however all fully overlayable and are in many
  3681.      ways faster and smaller than the provided CLIPPER string
  3682.      functions.
  3683.  
  3684.  
  3685.                               STARRANGE()
  3686.                               ===========
  3687.  
  3688.      Function:       STARRANGE( <expC>, <expN1>..<expN3> ) --> string
  3689.  
  3690.      Synopsis:       Rearranges a string.
  3691.  
  3692.                      <expC>  string to work on.
  3693.                      <expN1> starting position for extract
  3694.                      <expN2> length of extract
  3695.                      <expN3> new startplace of extract AFTER text was
  3696.                              extracted
  3697.  
  3698.      Samples:        lString := "WINTERGARDEN"
  3699.                      lString := STARRANGE( lString, 7, 6, 1 )
  3700.  
  3701.                      ( returns "GARDENWINTER" )
  3702.  
  3703.      Returns:        altered String
  3704.  
  3705.  
  3706.                              STBEGINSWITH()
  3707.                              ==============
  3708.  
  3709.      Function:       STBEGINSWITH( <expC1>, <expC2> ) --> logical
  3710.  
  3711.      Synopsis:       Determines if a string begins with another string
  3712.  
  3713.                      <expC1> target string to compare
  3714.  
  3715.                      <expC2> source string to compare target string
  3716.                              with
  3717.  
  3718.      Examples:       lString1 := "MASTERPROGRAM"
  3719.                      lString2 := "MASTER"
  3720.                      lString2 := "SWITCH"
  3721.  
  3722.                      STBEGINSWITH( lString1, lString2 ) returns .T.
  3723.                      STBEGINSWITH( lString1, lString3 ) returns .F.
  3724.  
  3725.      Returns:        .T. if <expC1> begins with <expC2>, otherwise .F.
  3726.  
  3727.                                STCENTER()
  3728.                                ==========
  3729.  
  3730.      Function:       STCENTER( <expC>, <expN> ) --> string
  3731.  
  3732.      Synopsis:       Centers a string within a given length. To do
  3733.                      this, the function will first pad the given string
  3734.                      to the length required ( set with <expN> ) and
  3735.                      centers the passed string ( in <expC> ) with the
  3736.                      given length.
  3737.  
  3738.                      <expC>  the string to be centered.
  3739.  
  3740.                      <expN>  the length ( width ) in which string is to
  3741.                              be centered.
  3742.  
  3743.      Examples:       lNewString := STCENTER( "Old String", 20 )
  3744.  
  3745.                         && lNewString is now 20 characters long and centered
  3746.                         && result:  "  Old String  "
  3747.  
  3748.      Notes:          If <expN> is less than the length of <expC>, the
  3749.                      function will return the same string unaltered.
  3750.  
  3751.      Returns:        a centered String if successful,
  3752.                      the passed string if unsuccessful,
  3753.                      NIL if parameters are invalid
  3754.  
  3755.                          STCHRINSTR()
  3756.                          ============
  3757.  
  3758.      Function:       STCHRINSTR( <expC1>, <expC2> ) --> integer
  3759.  
  3760.      Synopsis:       Searches a string for the first occurance of a
  3761.                      character and returns its position if found.
  3762.  
  3763.                      <expC1>  string to be searched
  3764.  
  3765.                      <expC2>  character to search for
  3766.  
  3767.      Examples:       lString := "This is a string"
  3768.  
  3769.                      lPos := STCHRINSTR( lString, "a" )
  3770.                             && lPos will contain 9
  3771.  
  3772.      Returns:        an integer showing the position of the found
  3773.                      character.
  3774.  
  3775.                                STCRUNCH()
  3776.                                ==========
  3777.  
  3778.      Function:       STCRUNCH( <expC>, <expN> ) --> string
  3779.  
  3780.      Synopsis:       Erases spaces contained in a string and appends
  3781.                      them to the end of the string.
  3782.  
  3783.                      <expC> string to work on
  3784.  
  3785.                      <expN> action code as defined in VERTEXUS.CH:
  3786.  
  3787.                         MOVE_ALL        = moves all spaces to end of string
  3788.                         MOVE_NO_SINGLE  = moves all but single spaces to end
  3789.                                           of string
  3790.  
  3791.      Examples:       lString1 := "MOEVENPICK         Ice Cream"
  3792.  
  3793.                      STCRUNCH( lString1, MOVE_NO_SINGLE )
  3794.                             && returns "MOEVENPICK Ice Cream       "
  3795.  
  3796.                      - or -
  3797.  
  3798.                      STCRUNCH( lString1, MOVE_ALL )
  3799.                             && returns "MOEVENPICKIceCream            "
  3800.  
  3801.      Returns:        crunched string depending upon action, NIL if
  3802.                      wrong parameters passed
  3803.  
  3804.                               STCUTLEFT()
  3805.                               ===========
  3806.  
  3807.      Function:       stcutleft( <expC1>, <expN1> ) --> string
  3808.  
  3809.      Synopsis:       The function is cutting off the left side of a
  3810.                      given string the amount of characters passed in
  3811.                      <expN1>.
  3812.  
  3813.                      <expC1> the string to cut
  3814.  
  3815.                      <expN1> the amount of characters to cut off
  3816.  
  3817.      Examples:       lString := "A very long string we have!"
  3818.                      lString := STCITLEFT( lString, 7 )
  3819.  
  3820.                      && lString = "long string we have!"
  3821.  
  3822.      Returns:        remaining string
  3823.  
  3824.                               STCUTRIGHT()
  3825.                               ============
  3826.  
  3827.      Function:       stcutright( <expC1>, <expN1> ) --> string
  3828.  
  3829.      Synopsis:       The function is cutting off the right side of a
  3830.                      given string the amount of characters passed in
  3831.                      <expN1>.
  3832.  
  3833.                      <expC1> the string to cut
  3834.  
  3835.                      <expN1> the amount of characters to cut off
  3836.  
  3837.      Examples:       lString := "A very long string we have!"
  3838.                      lString := STCUTRIGHT( lString, 9 )
  3839.  
  3840.                      && lString = "A very long string"
  3841.  
  3842.      Returns:        remaining string
  3843.  
  3844.  
  3845.                               STENDSWITH()
  3846.                               ============
  3847.  
  3848.      Function:       STENDSWITH( <expC1>, <expC2> ) --> logical
  3849.  
  3850.      Synopsis:       Determines if a string ends with another string
  3851.  
  3852.                      <expC1> target string to compare
  3853.  
  3854.                      <expC2> source string to compare target string
  3855.                              with
  3856.  
  3857.      Examples:       lString1 := "MASTERPROGRAM"
  3858.                      lString2 := "PROGRAM"
  3859.                      lString2 := "SWITCH"
  3860.  
  3861.                      STENDSWITH( lString1, lString2 ) returns .T.
  3862.                      STENDSWITH( lString1, lString3 ) returns .F.
  3863.  
  3864.      Returns:        .T. if <expC1> ends with <expC2>, otherwise .F.
  3865.  
  3866.                                 STLPAD()
  3867.                                 ========
  3868.  
  3869.      Function:       STLPAD( <expC>, <expN> ) --> string
  3870.  
  3871.      Synopsis:       Pads a string with spaces at left side of string
  3872.  
  3873.                      <expC>  string to pad
  3874.                      <expN>  new length of string
  3875.  
  3876.      Notes:          string will be truncated if <expN> is smaller than
  3877.                      original string length.
  3878.  
  3879.      Returns:        string left padded with spaces.
  3880.  
  3881.                           STLSHIFT()
  3882.                           ==========
  3883.  
  3884.      Function:       STLSHIFT( <expC>, <expN> ) --> string
  3885.  
  3886.      Synopsis:       Shift a string to left side. All leftmost
  3887.                      characters are lost.
  3888.  
  3889.                      <expC>  string to shift
  3890.  
  3891.                      <expN>  number of positions to shift left
  3892.  
  3893.      Returns:        string as remained after left-shift
  3894.  
  3895.                                 STRPAD()
  3896.                                 ========
  3897.  
  3898.      Function:       STRPAD( <expC>, <expN> ) --> string
  3899.  
  3900.      Synopsis:       Pads a string with spaces at right side of string
  3901.  
  3902.                      <expC>  string to pad
  3903.  
  3904.                      <expN>  new length of string
  3905.  
  3906.      Notes:          string will be truncated if <expN> is smaller than
  3907.                      original string length.
  3908.  
  3909.      Returns:        string right padded with spaces.
  3910.  
  3911.  
  3912.                           STRSHIFT()
  3913.                           ==========
  3914.  
  3915.      Function:       STRSHIFT( <expC>, <expN> ) --> string
  3916.  
  3917.      Synopsis:       Shift a string to right side. All rightmost
  3918.                      characters are lost.
  3919.  
  3920.                      <expC>  string to shift
  3921.  
  3922.                      <expN>  number of positions to shift right
  3923.  
  3924.      Returns:        string as remained after right-shift
  3925.  
  3926.                    IMPORTANT SYSTEM FUNCTION INFORMATION
  3927.                    =====================================
  3928.  
  3929.      All System functions are low level C and Assembler functions. They
  3930.      are all well behaved and written in Microsoft C 6.00 and Turbo
  3931.      Assembler 1.0
  3932.  
  3933.      I have sofar not experienced any problems with them and they
  3934.      should not give You any either. Never the less, since they go into
  3935.      the Hart of the Computer You should use them cautiously and
  3936.      strictly the way suggested in the descriptions.
  3937.  
  3938.      To speed things, I have ommitted any param checking in these
  3939.      functions as it is assumed You know what You are doing.
  3940.  
  3941.                                SYCHDIR()
  3942.                                =========
  3943.  
  3944.      Function:       SYCHDIR( <expC1> ) --> integer
  3945.  
  3946.      Synopsis:       Changes the current directory.
  3947.  
  3948.                      <expC1> the path where to change to.
  3949.  
  3950.      Returns:        0 if change occurred
  3951.                      an integer < 0 on error
  3952.  
  3953.                               SYCHDRIVE()
  3954.                               ===========
  3955.  
  3956.      Function:       SYCHDRIVE( <expC1>|<expN1> ) --> logical
  3957.  
  3958.      Synopsis:       changes the standard drive.
  3959.  
  3960.                      <expC1>    a character identifying the drive to
  3961.                                 change to
  3962.  
  3963.                      <expN1>    a number identifying the drivenumber to
  3964.                                 change to the number represents the drive 
  3965.                                 as identified by DOS.
  3966.  
  3967.      Returns:        .T. if successful
  3968.                      .F. on error
  3969.  
  3970.  
  3971.                               SYCOLDBOOT()
  3972.                               ============
  3973.  
  3974.      Function:       SYCOLDBOOT() --> NIL
  3975.  
  3976.      Synopsis:       Reboots the system (includes a RAM-Check )
  3977.  
  3978.      Returns:        nothing
  3979.  
  3980.  
  3981.                           SYCURDRV()
  3982.                           ==========
  3983.  
  3984.      Function:       SYCURDRV() --> integer
  3985.  
  3986.      Synopsis:       Returns the current Drivenumber.
  3987.  
  3988.                      The function checks the system and returns the
  3989.                      current drive in form of a number
  3990.                      ( 1 = A, 2 = B, 3 = C, ... etc. )
  3991.  
  3992.      Returns:        an integer identifying the current drive.
  3993.  
  3994.  
  3995.                               SYDRVEFREE()
  3996.                               ============
  3997.  
  3998.      Function:       SYDRVEFREE( <expN1>|<expC1> ) --> integer
  3999.  
  4000.      Synopsis:       Checks a drive and returns the free Diskspace.
  4001.  
  4002.                      <expN1>|
  4003.                      <expC1>  the identifier of the drive to be checked
  4004.  
  4005.                      if a number is passed it will represent the drive
  4006.                      according to the DOS calling convention
  4007.  
  4008.      Returns:        a long integer representing the free diskspace
  4009.                      available.
  4010.  
  4011.                           SYDRIVE()
  4012.                           =========
  4013.  
  4014.      Function:       SYDRIVE() --> character
  4015.  
  4016.      Synopsis:       Returns the current Drive.
  4017.  
  4018.                      The function is calling the C-Function
  4019.                      SYCURDRV() to convert the drivenumber returned
  4020.                      by the C-Function into the equivalent Character
  4021.                      value.
  4022.  
  4023.      Returns:        a character identifying the current drive.
  4024.  
  4025.                                SYDRIVES()
  4026.                                ==========
  4027.  
  4028.      Function:       SYDRIVES() --> string
  4029.  
  4030.      Synopsis:       Get available drives of system an returns these in
  4031.                      a string.
  4032.  
  4033.  
  4034.      Return:         string of available drives
  4035.  
  4036.  
  4037.                               SYDRVETTL()
  4038.                               ===========
  4039.  
  4040.      Function:       SYDRVETTL( <expN1>|<expC1> ) --> integer
  4041.  
  4042.      Synopsis:       Checks a drive and returns the total Diskspace.
  4043.  
  4044.                      <expN1>|
  4045.                      <expC1>  the identifier of the drive to be checked
  4046.  
  4047.                      if a number is passed it will represent the drive
  4048.                      according to the DOS calling convention
  4049.  
  4050.      Returns:        a long integer representing the total diskspace
  4051.                      available.
  4052.  
  4053.  
  4054.                                SYDRVROK()
  4055.                                ==========
  4056.  
  4057.      Function:       SYDRVRDOK( <expC1>|<expN1> ) --> logical
  4058.  
  4059.      Synopsis:       Check if the drive, identified by the parameter is
  4060.                      ready to read or not.
  4061.  
  4062.      Examples:       IF SYDRVRDOK( "A" )
  4063.                         .... your code to read from disk ...
  4064.                      ELSE
  4065.                         .... other action since drive is not ready ....
  4066.                      ENDIF
  4067.  
  4068.      Returns:        .T. if drive is ready, otherwise .F.
  4069.  
  4070.                                SYDRVWOK()
  4071.                                ==========
  4072.  
  4073.      Function:       SYDRVWRTOK( <expC1>|<expN1> ) --> logical
  4074.  
  4075.      Synopsis:       Check if the drive, identified by the parameter is
  4076.                      ready to write or not.
  4077.  
  4078.      Examples:       IF SYDRVWRTOK( "A" )
  4079.                         .... your code to write to disk ...
  4080.                      ELSE
  4081.                         .... other action since drive is not ready ....
  4082.                      ENDIF
  4083.  
  4084.      Returns:        .T. if drive is ready, otherwise .F.
  4085.  
  4086.  
  4087.                           SYMKDIR()
  4088.                           =========
  4089.  
  4090.      Function:       SYMKDIR( <expC1> ) --> integer
  4091.  
  4092.      Synopsis:       Creates a subdirectory.
  4093.  
  4094.                      <expC1> is string naming the new subdirectory
  4095.  
  4096.      Notes:          <expC1> should be a string such as You would use
  4097.                      when creating a subdirectory in the DOS
  4098.                      environment with the DOS command "MD" or "MKDIR".
  4099.  
  4100.      Returns:        0 if subdirectory created succesfully, any number
  4101.                      less than 0 on error.
  4102.  
  4103.                                SYRMDIR()
  4104.                                =========
  4105.  
  4106.      Function:       SYRMDIR( <expC1> ) --> integer
  4107.  
  4108.      Synopsis:       Erases the subdirectory passed as parameter.
  4109.  
  4110.                      <expC1> the subdirectory to be erased.
  4111.  
  4112.      Notes:          The subdirectory to be erased must be empty.
  4113.  
  4114.      Returns:        0 if erased correctly; an integer < 0 on error
  4115.  
  4116.  
  4117.              IMPORTANT GENERAL FUNCTIONS INFORMATION
  4118.              =======================================
  4119.  
  4120.      In this category I have included all functions for which I have
  4121.      not established a group.
  4122.  
  4123.      You may find some functions in here provided by someone else I
  4124.      have included them here simply because they are good and
  4125.      complement the CLIPPER library in many ways. These functions were
  4126.      all distributed inclusive Source code, and I have included the
  4127.      source code on the disk for Your usage.
  4128.  
  4129.      Wherever I used someone elses function, I have made mentioning of
  4130.      it. I do not want to have any credit for it, nor do I want to make
  4131.      anything out of it. I simply use them and provide them to You for
  4132.      Your benefit.
  4133.  
  4134.  
  4135.                                UTBITSET()
  4136.                                ==========
  4137.  
  4138.      Function:       UTBITSET( <expC1>, <expN1> ) --> character
  4139.  
  4140.      Synopsis:       Sets a selected bit in a BYTE (character)
  4141.  
  4142.                      <expC1> character (BYTE) to set a bit in
  4143.  
  4144.                      <expN1> bitposition to set ( 0 - 7, right to left )
  4145.  
  4146.                      In effect, ORs argument byte with a byte that has
  4147.                      only the target bit set.  If bit is already set,
  4148.                      it remains set.
  4149.  
  4150.      Examples:       Newbyte := UTBITSET( CHR(107), 4 )
  4151.                      ? ASC( Newbyte ) // result: 123
  4152.                      ? Newbyte  // result: '{'
  4153.  
  4154.      Returns:        New byte (character) , with designated bit set.
  4155.                      If parameters are faulty, returns NIL.
  4156.  
  4157.                               UTBELLATTN()
  4158.                               ============
  4159.  
  4160.      Function:       UtBellAttn() --> NIL
  4161.  
  4162.      Synopsis:       a single tone at 200 Hz for the duration of 1/18th
  4163.                      of a second and 100 Hz for the same duration.
  4164.  
  4165.      Note:           The tone sounds only if the global variable _quiet
  4166.                      is set to .F.
  4167.  
  4168.  
  4169.      Returns:        nothing
  4170.  
  4171.                              UTBELLERROR()
  4172.                              =============
  4173.  
  4174.      Function:       UtBellError() --> NIL
  4175.  
  4176.      Synopsis:       a single tone at 100 Hz for the duration of 2/18th
  4177.                      of a second.
  4178.  
  4179.      Note:           The tone sounds only if the global variable _quiet
  4180.                      is set to .F.
  4181.  
  4182.  
  4183.      Returns:        nothing
  4184.  
  4185.                               UTBELLDONE()
  4186.                               ============
  4187.  
  4188.      Function:       UtBellDone() --> NIL
  4189.  
  4190.      Synopsis:       a single tone at 500 Hz for the duration of 1/18th
  4191.                      of a second.
  4192.  
  4193.      Note:           The tone sounds only if the global variable _quiet
  4194.                      is set to .F.
  4195.  
  4196.  
  4197.      Returns:        nothing
  4198.  
  4199.                          UTBELLUDF()
  4200.                          ===========
  4201.  
  4202.      Function:       UtBellUdf( <expA1> ) --> NIL
  4203.  
  4204.      Synopsis:       a single tone or a combination of tones depending
  4205.                      upon the values passed.
  4206.  
  4207.                      <expA1> a 2-dim. array containing one or more
  4208.                              tones.
  4209.  
  4210.                      The array should be created in following fashion:
  4211.  
  4212.                         { { <frequency>,... }, { <duration>,... } }
  4213.  
  4214.  
  4215.      Examples:       To have the same effect with UtBellUdf() as with
  4216.                      UtBellAttn() create an array like:
  4217.  
  4218.                         AttnTone := { { 200, 100 }, { 1, 1 } }
  4219.  
  4220.                      and call the function like:
  4221.  
  4222.                         UtBellUdf( Attntone )
  4223.  
  4224.  
  4225.      Note:           The tone sounds only if the global variable _quiet
  4226.                      is set to .F.
  4227.  
  4228.  
  4229.      Returns:        nothing
  4230.  
  4231.  
  4232.                               UTBYTEAND()
  4233.                               ===========
  4234.  
  4235.      Function:       UTBYTEAND( <expC1>, <expC2> ) --> character
  4236.  
  4237.      Synopsis:       Performs bit-wise AND on two BYTES (characters)
  4238.  
  4239.                      <expC1> BYTE to be AND'ed
  4240.  
  4241.                      <expC2> to AND <expC1> with
  4242.  
  4243.                      <expC1> and <expC2> are characters from CHR(0) TO
  4244.                      CHR(255). May be passed in CHR() form, as
  4245.                      character literals, or as expressions evaluating
  4246.                      to CHR() values.
  4247.  
  4248.                      Can be used for any bit-wise masking operation. In
  4249.                      effect, this is a bit-by-bit AND operation.
  4250.                      Equivalent to AND assembler instruction.
  4251.  
  4252.      Returns:        resulting byte, in CHR() form. If parameters are
  4253.                      faulty, returns NIL.
  4254.  
  4255.  
  4256.  
  4257.  
  4258.                                UTBYTEOR()
  4259.                                ==========
  4260.  
  4261.      Function:       UTBYTEOR( <expC1>, <expC2> ) --> character
  4262.  
  4263.      Synopsis:       Performs bit-wise OR on two characters.
  4264.  
  4265.                      <expC1> the character to be OR'd
  4266.  
  4267.                      <expC2> the character to OR with
  4268.  
  4269.                      <expC1> and <expC2> are characters from CHR(0) TO
  4270.                      CHR(255). May be passed in CHR() form, as
  4271.                      character literals, or as expressions evaluating
  4272.                      to CHR() values.
  4273.  
  4274.  
  4275.      Examples:       This code performs a bit-wise OR on two bytes
  4276.                      represented by CHR(20) and CHR(10):
  4277.  
  4278.                      NewChar := UTBYTEOR( CHR(20), CHR(10) )
  4279.                      ? ASC( NewChar )   // result: 30
  4280.                      ? NewChar          // result: non-printable
  4281.                      character
  4282.  
  4283.      Returns:        character in CHR() form.  If parameters are
  4284.                      faulty, returns NIL.
  4285.  
  4286.  
  4287.                             UTCHKCURSTYPE()
  4288.                             ===============
  4289.  
  4290.      Function:       UtChkCursType( <expN> ) --> logical value
  4291.  
  4292.      Synopsis:       accepts a numerical value representing the
  4293.                      cursortype defined in CLIPPER for user with the
  4294.                      SETCURSOR() function
  4295.  
  4296.                      <expN>  numerical expression as defined in
  4297.                      SETCURS.CH
  4298.  
  4299.      Returns:        .T. if numerical expression identifies valid
  4300.                      cursorshape .F. if numerical expression out of
  4301.                      bounds or expression invalid.
  4302.  
  4303.                              UTCOLCONVERT()
  4304.                              ==============
  4305.  
  4306.      Function:       UTCOLCONVERT( <expC1>, <expN1> ) --> integer
  4307.  
  4308.      Synopsis:       returns a color integer for colorsetting
  4309.  
  4310.                      You have Your colorstring but need the reference
  4311.                      color integer.
  4312.  
  4313.                      <expC1> colorstring to convert
  4314.  
  4315.                      <expN1> what part of colorstring to retrieve as
  4316.                              integer identified as:
  4317.  
  4318.                             0 = foreground standard
  4319.                             1 = background standard
  4320.                             2 = standard colorsetting
  4321.                             3 = foreground enhanced
  4322.                             4 = background enhanced
  4323.                             5 = enhanced colorsetting
  4324.  
  4325.      Examples:       lColor := UTCOLCONVERT( SETCOLOR(), 2 )  
  4326.                                                         && returns standard
  4327.                                                         && color integer
  4328.                      lColor := UTCOLCONVERT( SETCOLOR(), 2 )+128
  4329.                                                         && returns standard
  4330.                                                         && color integer
  4331.                                                         && and sets the blink
  4332.                                                         && attribute
  4333.  
  4334.                      lColor := UTCOLCONVERT( "W/N", 1 ) && returns background
  4335.  
  4336.  
  4337.      Returns:        Integer representing the CLIPPER color number.
  4338.  
  4339.  
  4340.                                UTCTRLW()
  4341.                                =========
  4342.  
  4343.      Function:       UTCTRLW()
  4344.  
  4345.      Synopsis:       Sends a CONTROL-W  ( CHR(23) ) to the keyboard.
  4346.  
  4347.                      Allows remapping of a key to Ctrl-W
  4348.  
  4349.      Examples:       SET KEY F10 to UTCTRLW
  4350.                      && sends CTRL-W to keyboard whenever F10 is pressed
  4351.  
  4352.      Returns:        Nothing
  4353.  
  4354.  
  4355.                             UTGETCURSTYPE()
  4356.                             ===============
  4357.  
  4358.      Function:       UtGetCursType(  [<expN1> .. <expN4>], [<expC>],
  4359.                                      [<expN5>] ) --> integer
  4360.  
  4361.      Synopsis:       Pops up a window of selection of available cursor
  4362.                      types.
  4363.  
  4364.                      Call this function:
  4365.  
  4366.                         cursshape := UtGetCursType()
  4367.                         SETCURSOR( cursshape )
  4368.  
  4369.                      [<expN1>..<expN4>]      optional window coordinates
  4370.                                              defaults to screen center.
  4371.  
  4372.                      [<expC>]        optional box Colorstring defaults to
  4373.                                      c_popcol
  4374.                      [<expN5>]       optional boxshadow position defaults
  4375.                                      to c_shadpos
  4376.  
  4377.                      if no coordinates are given, the window is popped
  4378.                      up in the center of the screen with default
  4379.                      colors.
  4380.  
  4381.      Returns:        an Integer denoting the cursorshape to be used
  4382.                      with the CLIPPER function SETCURSOR(). If no
  4383.                      cursorshape was selected the function returns the
  4384.                      currents cursor shape.
  4385.  
  4386.  
  4387.                           UTDRIVES()
  4388.                           ==========
  4389.  
  4390.      Function:       UTDRIVES() --> string
  4391.  
  4392.      Synopsis:       Checks the Computer System for available drives
  4393.                      and returns info as string.
  4394.  
  4395.  
  4396.      Examples:       lString := UTDRIVES()
  4397.  
  4398.                      && lString may contain "ABC"
  4399.                      && if computer has 2 Floppies and 1 HD
  4400.  
  4401.      Notes:          virtual disks will be reportet as well This
  4402.                      Function is a C-Function.
  4403.  
  4404.  
  4405.                                UTEDPIC()
  4406.                                =========
  4407.  
  4408.      Function:       Utedpic( <expC1>, <expN1>, <expN2>, [<expC2>] ) 
  4409.                                 --> PICTURE
  4410.  
  4411.      Synopsis:       Returns a picture clause appropriate for editing
  4412.                      field
  4413.  
  4414.                      <expC1> is the value of the field or variable.
  4415.  
  4416.                      <expN1> denotes LEFTMOST COLUMN where GET is
  4417.                              displayed.
  4418.  
  4419.                      <expN2> denotes RIGHTMOST COLUMN where GET is
  4420.                              displayed.
  4421.  
  4422.                      [<expC2>] allows optionally passing of userdefined
  4423.                                PICTURE.
  4424.  
  4425.      Notes:          Checks if RIGHTMOST column lies within Screen
  4426.                      Boundaries and adjusts the column to POSSIBLE
  4427.                      RIGHTMOST COLUMN - 2 if only the first 3
  4428.                      parameters are passed.
  4429.  
  4430.                      Boundary checks are not done if [<expC2>] is
  4431.                      passed as it is assumed that user knows what he is
  4432.                      doing.
  4433.  
  4434.                      If Utedpic is used on Numeric fields, make sure
  4435.                      that overall fieldlength does not exceed 15
  4436.                      positions EXLUSIVE the signs -+.() as they are
  4437.                      counted as positions as well by CLIPPER, otherwise
  4438.                      the number may not be displayed and Your will see
  4439.                      the whole field displayed in default width filled
  4440.                      with "*". Can't do anything about this ( at least
  4441.                      have not found a way around it ) as it seems to be
  4442.                      CLIPPER's own decision to do this.
  4443.  
  4444.      Example:        @10,10 GET FIRSTNAME PICTURE UTEDPIC( @FIRSTNAME,;
  4445.                                                            10, 20 )
  4446.  
  4447.                      && would return a picture of "@KSXXXXXXXXXX"
  4448.  
  4449.      Returns:        Picture - description
  4450.  
  4451.                               UTENHANCED()
  4452.                               ============
  4453.  
  4454.      Function:       UTENHANCED() --> integer
  4455.  
  4456.      Synopsis:       returns a color integer for enhanced setting used
  4457.                      for functions that require it like ATT() and
  4458.                      PRNT()
  4459.  
  4460.      Examples:       lColor := UTENHANCED()  
  4461.                                         && returns enhanced color integer
  4462.                      PRNT(10,10,"Waiting...!",lColor )
  4463.  
  4464.  
  4465.      Returns:        Integer representing the CLIPPER color number.
  4466.  
  4467.  
  4468.                             UTERRFUNCTION()
  4469.                             ===============
  4470.  
  4471.      Function:       UtErrFunction( <expO> ) --> NIL
  4472.  
  4473.      Synopsis:       The VERTEX Error handling function.
  4474.  
  4475.                      Handles various kinds of errors and informs the
  4476.                      user of the kind of error happening. Gives the
  4477.                      user then a choice of actions which will be stored
  4478.                      in the ErrorObject:cargo slot for further action.
  4479.  
  4480.                      Although no value is being returned, You are able
  4481.                      to use the ErrorObject for Your RECOVERY.
  4482.  
  4483.                      Several possible errors are being directly
  4484.                      treated:
  4485.  
  4486.                             1)  opening a Database
  4487.                             2)  opening an Index
  4488.                             3)  DOS file open error
  4489.                             4)  DOS file close error
  4490.                             5)  File corruption error
  4491.  
  4492.                      E.g. You allow the user to open some file for
  4493.                      usage but You cant be sure that the user opens a
  4494.                      DBase Type file for reading. This would result in
  4495.                      a fatal error crashing Your program. To have a
  4496.                      chance to continue anyway (i.e. allow the user to
  4497.                      reselect a file ) do the following:
  4498.  
  4499.                             a) set up Your own error handle
  4500.                             b) allow the user to select the database
  4501.                             c) open the database while using the statement
  4502.  
  4503.                             BEGIN SEQUENCE ...
  4504.                             RECOVER USING ...
  4505.                             END
  4506.  
  4507.                             d) test ErrorObject:cargo if recover is wanted.
  4508.  
  4509.      Examples:       LOCALlObjLocal,;           && contains the ErrorObject
  4510.                      lSelFile,;                 && contains selected filename
  4511.                      lSuccess := .T.            && set to false if file is bad
  4512.  
  4513.                                                 && install
  4514.                      Errorfunction
  4515.                      lLastHandle := ERRORBLOCK( { | FileobjErr |;
  4516.                                               UtErrFunction( FileobjErr ) } )
  4517.  
  4518.                      DO WHILE .T.
  4519.  
  4520.                         .... allow the user to select a file .....
  4521.  
  4522.                         BEGIN SEQUENCE
  4523.                             USE ( lSelFile ) NEW    && use the selected file
  4524.  
  4525.                             RECOVER USING lObjLocal 
  4526.                                                 && the ErrorObject will be
  4527.                                                 && used here... Remember that
  4528.                                                 && the CARGO slot will contain
  4529.                                                 && a .T. or .F. value
  4530.                                                 && depending
  4531.                                                 && on the action the user
  4532.                                                 && wants to do since
  4533.                                                 && his action failed.
  4534.                             IF ErrorObject:cargo
  4535.                                 LOOP
  4536.                             ELSE                    
  4537.                                 lSuccess := .F.     
  4538.                                 EXIT        
  4539.                             ENDIF
  4540.                         END
  4541.                      END
  4542.  
  4543.      Returns:        Nothing
  4544.  
  4545.                              UTEXPRISTRUE()
  4546.                              ==============
  4547.  
  4548.      Function:       UtExpristrue( <expC> ) --> logical
  4549.  
  4550.      Synopsis:       Evaluates an expression used against a Database
  4551.                      record. Used by CLIPPER function DBEVAL() in
  4552.                      second codeblock parameter if the expression is
  4553.                      stored in a variable.
  4554.  
  4555.                      E.g.:
  4556.                         
  4557.                      lExpr := "SOUNDEX(FIELDGET(1)) = SOUNDEX("MASTERS")"
  4558.  
  4559.                      To use DBEVAL() correctly by using a variable as
  4560.                      FOR or WHILE condition in the respective
  4561.                      codeblock, the expression must be used as a MACRO
  4562.                      to be evaluated to a LOGICAL value.
  4563.  
  4564.                      E.g.:
  4565.                         
  4566.                      DBEVAL( {|| <dowhatever if TRUE> }, {|| &lExpr } ).
  4567.  
  4568.                      To use an expression together with a macro in the
  4569.                      second codeblock, we have to call the
  4570.                      UtExpristrue() function and pass the expression to
  4571.                      it for evaluation.
  4572.  
  4573.                      E.g.:
  4574.                 
  4575.                      DBEVAL({||...},{||firstfunc(),UtExpristrue(lExpr)})
  4576.  
  4577.                      This runs the DBEVAL() function correctly.
  4578.  
  4579.      Note:           If you want to use this Expression Evaluation
  4580.                      Function, make sure it is called LAST within the
  4581.                      second codeblock of the DBEVAL() function or
  4582.                      things wont work.
  4583.  
  4584.                      No Typechecking is done to ensure maximum speed so
  4585.                      make sure you pass a valid expression. Best use
  4586.                      the function MfMakeExpr() to create interactively
  4587.                      a VALID expression.
  4588.  
  4589.      Returns:        .T. if expression evaluates to .T. otherwise .F.
  4590.  
  4591.                          UTSAVEKEY()
  4592.                          ===========
  4593.  
  4594.      Function:       UtSaveKey( <expL> ) --> NIL
  4595.  
  4596.      Synopsis:       Saves and restores SET KEYS of F1 to F10 key
  4597.  
  4598.                      If you call this function, it will save or recall
  4599.                      SET KEYS depending upon the parameter passed. This
  4600.                      enables you to re-assign SET KEYS to functions
  4601.                      after you have called this function and RE-set the
  4602.                      keys afterwards to their original settings.
  4603.  
  4604.      Examples:       SET KEY K_F1 to Help       
  4605.                                         && sets F1 to Help() function
  4606.                      UtSaveKey( .T. )           
  4607.                                         && save the setting
  4608.                      SET KEY K_F1 to OtherHelp  
  4609.                                         && sets F1 to OtherHelp() function
  4610.                      UtSaveKey( .F. )           
  4611.                                         && resets F1 to Help() function
  4612.  
  4613.      Notes:          Don't call the UtSaveKey() function twice in a row
  4614.                      with the parameter .T. or the first saved
  4615.                      functionkey setting are being lost.
  4616.  
  4617.                      e.g.   SET KEY K_F1 to Help
  4618.                         UtSaveKey( .T. )
  4619.                         UtSaveKey( .T. )  <-- all settings are 
  4620.                                               lost at this point
  4621.  
  4622.  
  4623.      Returns:         0 if call was unsuccessful
  4624.                       1 if functions are saved
  4625.                      -1 if functions are restored
  4626.  
  4627.  
  4628.                                 UTINIT()
  4629.                                 ========
  4630.  
  4631.      Function:       UTINIT() --> NIL
  4632.  
  4633.      Synopsis:       Initializes the global variables expected by
  4634.                      functions located in the Library if they are not
  4635.                      already present.
  4636.  
  4637.                      It will also look for a variable called
  4638.                      _SETISCOLOR. If it is present and of type "L", its
  4639.                      value will be used in place of ISCOLOR(). You
  4640.                      may want to initialize a public variable
  4641.                      _SETISCOLOR if you have one of those card/monitor
  4642.                      combos that fool ISCOLOR().
  4643.  
  4644.                      UTINIT() will also check Your system for the
  4645.                      presence of a graphics adapter and set the
  4646.                      graphics GLOBALS to the highest possible value in
  4647.                      sequence of:
  4648.  
  4649.                             CGA
  4650.                             EGA
  4651.                             VGA  resolutions.
  4652.  
  4653.                      If You have a graphics adapter with different
  4654.                      resolutions than the standard listed above, You
  4655.                      may use the function GRINIT() to set the maximal
  4656.                      X,Y coordinates for Your system.
  4657.  
  4658.      Examples:       at beginning of top level program...
  4659.  
  4660.                      UTINIT()
  4661.  
  4662.      Notes:          Its always a good idea to call this at your top
  4663.                      level program. All of the functions doing screen
  4664.                      i/o call it. It initializes the global variable
  4665.                      _CLIPFUNC the first time it is called.
  4666.  
  4667.      Returns:        Nothing
  4668.  
  4669.                                UTISBIT()
  4670.                                =========
  4671.  
  4672.      Function:       UTISBIT( <expC1>, <expN1> ) --> logical
  4673.  
  4674.      Synopsis:       Test bitstatus of bits in a BYTE (character)
  4675.  
  4676.                      <expC1> BYTE or character to examine
  4677.  
  4678.                      <expN1>    Bitposition to examine (0 - 7, right to
  4679.                                 left )
  4680.                             i.e.    0 is equal to rightmost bit,
  4681.                                     7 is equal to leftmost bit.
  4682.  
  4683.                      Checks the identified Bit position in a given Byte
  4684.                      for the status of the identified Bit.
  4685.  
  4686.      Examples:       lBitflag := UTISBIT(CHR(65), 7)
  4687.  
  4688.                      ? lBitflag// result: .T.
  4689.  
  4690.                      ? UTISBIT('A', 5)  // result: .F.
  4691.  
  4692.      Returns:        .T. if designated bit is set,
  4693.                      .F. if bit is not set,
  4694.                      otherwise NIL
  4695.  
  4696.                               UTKEEPVAR()
  4697.                               ===========
  4698.  
  4699.      Function:       UtKeepVar( <expC1> ) --> Filename
  4700.  
  4701.      Synopsis:       Writes <expC1> to disk and returns a unique
  4702.                      Filename.
  4703.  
  4704.                      <expC1> a string of any kind.
  4705.  
  4706.                      This Function is very useful in writing saved
  4707.                      screen variables to disk for keeping them there
  4708.                      for the duration of the program so they may be
  4709.                      recalled at a later time. Allows saving quite some
  4710.                      Memory.
  4711.  
  4712.                      MEMO Fields may be exported into a file for
  4713.                      editing with an external editor.
  4714.  
  4715.                      Just remember to erase the Files. Do this by using
  4716.                      the function uttempclean() as last functioncall in
  4717.                      your program:
  4718.  
  4719.      Examples:       lScrSave := SAVESCREEN( 0,0,20,50 )
  4720.                      lFilename := UtKeepVar( lScrSave )
  4721.                         && lFilename contains a unique filename where
  4722.                      the SAVESCREEN
  4723.                         && string was written to...
  4724.  
  4725.                      - or -
  4726.  
  4727.                      lFilename := UtKeepVar("this string is written to disk")
  4728.  
  4729.  
  4730.      Returns:        Filename if successfully saved, otherwise empty string
  4731.  
  4732.                               UTPROFILE()
  4733.                               ===========
  4734.  
  4735.      Function:       utprofile()
  4736.  
  4737.      Synopsis:       This is a Clipper 5.01 specific re-write of the
  4738.                      profiler included with  Blinker 1.5x (originally
  4739.                      written and donated by Frederick W. Stangl,
  4740.                      President of Dynamic Performance Inc.,
  4741.                      Philadelphia, PA).
  4742.  
  4743.                      This version of the profiler was written by Todd
  4744.                      C. MacDonald, Senior Programmer/Analyst of Key
  4745.                      Services Corporation, Albany, NY, and is also
  4746.                      donated to the Blinker community.
  4747.  
  4748.                      This version takes advantage of 5.01's nested
  4749.                      arrays to allow viewing of the profiling
  4750.                      statistics in any user-selectable order.
  4751.  
  4752.                      To invoke the profiler from any wait-state, press
  4753.                      [Alt]-[P].
  4754.  
  4755.                      I found this modul so good, I included in the
  4756.                      library for development purposes.
  4757.  
  4758.                      The source-code may be ordered by sending me a SAE
  4759.                      together with US $ 10.00 for postage and handling
  4760.                      and I will provide You with the source on disk;
  4761.                      the code is also available on several good
  4762.                      Bulletin Boards and via COMPUSERVE in the
  4763.                      Nantucket User Forum.
  4764.  
  4765.                               UTSTANDARD()
  4766.                               ============
  4767.  
  4768.      Function:       UTSTANDARD() --> integer
  4769.  
  4770.      Synopsis:       returns a color integer for standard setting used
  4771.                      for functions that require it like VIATT() and
  4772.                      VIPRNT()
  4773.  
  4774.                      The functions writes the string direct to VIDEO
  4775.                      MEMORY and is thus VERY FAST!!! However it doesn't
  4776.                      work in all modes (some graphics modes ). It works
  4777.                      with all video modes using either B000h or B800h
  4778.                      as base address ( e.g. EGA, VGA etc. )
  4779.  
  4780.      Examples:       lColor := UTSTANDARD()     && returns standard
  4781.                                                 && color integer
  4782.                      lColor := UTSTANDARD()+128 && returns standard
  4783.                                                 && color integer
  4784.                                                 && and sets the blink 
  4785.                                                 && attribute
  4786.                      VIPRNT(10,10,"Waiting...!",lColor )
  4787.  
  4788.  
  4789.      Returns:        Integer representing the CLIPPER color number.
  4790.  
  4791.  
  4792.                         UTUNSELECTED()
  4793.                         ==============
  4794.  
  4795.      Function:       UTUNSELECTED() --> integer
  4796.  
  4797.      Synopsis:       Returns a color integer for UNSELECTED setting
  4798.  
  4799.                      used by functions ATT() and PRNT()
  4800.  
  4801.      Returns:        numeric color integer
  4802.  
  4803.  
  4804.                     IMPORTANT VIDEO FUNCTION INFORMATION
  4805.                     ====================================
  4806.  
  4807.      I have put together a host of videofunctions which are supposed to
  4808.      help in writing applications which use the peculiarities of the
  4809.      Video Cards ( VGA, XVGA etc. ) You can buy nowadays and give You
  4810.      the chance of using higher resolutions and thus more info on the
  4811.      screen.
  4812.  
  4813.  
  4814.      The provided Videofunctions are all written in Assembler language
  4815.      and provide direct access to Video Card interrupts.
  4816.  
  4817.      The functions will make use of documented features of the video
  4818.      cards and should therefore work for all video cards that are able
  4819.      to support the screen modes the functions will try to switch to.
  4820.  
  4821.      The general videofunctions will use the INT10h BIOS call to switch
  4822.      modes. Following modes are being used:
  4823.  
  4824.                                         00h - 13h
  4825.  
  4826.      The documentation to these modes You may find in the Microsoft
  4827.      Press series of books. Before You use any of these general
  4828.      videofunctions make sure that the installed videocard can make use
  4829.      of the requested modes. Using the general function whilst having a
  4830.      videocard installed that does not support the requested modes may
  4831.      however result in the worst case in a System-Lockup ( generally
  4832.      the functions simply don't work ).
  4833.  
  4834.      Be aware though that Your Video Card MUST support the display mode
  4835.      You try to select. Usually the functions just don't do anything
  4836.      however in some extreme rare cases You may hang the System.
  4837.  
  4838.      So use the functions wisely.
  4839.  
  4840.                                 VIATT()
  4841.                                 =======
  4842.  
  4843.      Function:       VIATT( <expN1> .. <expN5>, [<expC1>] ) --> NIL
  4844.  
  4845.      Synopsis:       Change attribute of area of the screen
  4846.  
  4847.                      <expN1>..<expN4>   screen coordinates to change
  4848.                                         attributes ( top, left, bottom,
  4849.                                         right )
  4850.  
  4851.                      <expN5>    new attribute to set area to
  4852.  
  4853.                      <expC1>    optional character to fill area with
  4854.  
  4855.                      The functions writes the string direct to VIDEO
  4856.                      MEMORY and is thus VERY FAST!!! However it doesn't
  4857.                      work in all modes (some graphics modes ). It works
  4858.                      with all video modes using either B000h or B800h
  4859.                      as base address ( e.g. EGA, VGA etc. )
  4860.  
  4861.      Examples:       VIATT( 10,10,20,60,16,"+" )
  4862.  
  4863.      Returns :       nothing.
  4864.  
  4865.                                 VICLS()
  4866.                                 =======
  4867.  
  4868.      Function:       VICLS( [<expN>], [<expC>] ) --> NIL
  4869.  
  4870.      Synopsis:       Clears the current screen with optional color and
  4871.                      character
  4872.  
  4873.                      [<expN>]   an optional color-number which is used
  4874.                                 to clear the current screen
  4875.  
  4876.                      [<expC>]   an optional character which is used.
  4877.  
  4878.                      This is a low level function to clear the screen
  4879.                      and does not depend upon the CLIPPER color scheme.
  4880.                      The numeric color code however is the same that
  4881.                      CLIPPER supports sofar.
  4882.  
  4883.      Examples:       VICLS()                    && clear screen with
  4884.                                                 && current color
  4885.                      VICLS( 48 )                && clear screen black
  4886.                                                 && on cyan
  4887.                      VICLS( 48, CHR( 176 ) )    && clear screen
  4888.                                                 && black on cyan with
  4889.                                                 && character "+"
  4890.  
  4891.      Returns:        Nothing
  4892.  
  4893.                               VICOLGRID()
  4894.                               ===========
  4895.  
  4896.      Function:       VICOLGRID( <expN1>, <expN2> )
  4897.  
  4898.      Synopsis:       Draws colored blocks in SETCOLORS() function
  4899.  
  4900.                      <expN1> top row coordinate
  4901.  
  4902.                      <expN2> top left coordinate
  4903.  
  4904.                      The function will draw a number of blocks on the
  4905.                      screen in SETCOLOR() attributes. Used by
  4906.                      MFSETCOLOR() function
  4907.  
  4908.      Returns:        Nothing
  4909.  
  4910.                                 VIFADE()
  4911.                                 ========
  4912.  
  4913.      Function:       VIFADE(<expN1>..<expN4>,<expC1>,<expN5>) --> NIL
  4914.  
  4915.      Synopsis:       Fades a screen variable off the screen
  4916.  
  4917.                      <expN1> .. <expN4> screen coordinates
  4918.  
  4919.                      <expC1>    screen variable to fade off the screen
  4920.  
  4921.                      <expN5>    time delay to use ( 0 - 20 )
  4922.  
  4923.      Returns:        Nothing
  4924.  
  4925.  
  4926.                          VIGETMODE()
  4927.                          ===========
  4928.  
  4929.      Function:       VIGETMODE() --> array
  4930.  
  4931.      Synopsis:       Returns Video System Info
  4932.  
  4933.                      The function will post Video System information
  4934.                      into an array 5 elements long with following
  4935.                      information:
  4936.  
  4937.                      array[1]   hex string of current screen mode
  4938.  
  4939.                      array[2]   available columns ( integer )
  4940.  
  4941.                      array[3]   available rows ( integer )
  4942.  
  4943.                      array[4]   current page ( integer )
  4944.  
  4945.                      array[5]   0 for MONO, 1 for COLOR adapter
  4946.  
  4947.      Examples:       lArray := VIGETMODE()
  4948.  
  4949.      Returns:        array if called successfully, otherwise NIL
  4950.  
  4951.                                VIISCGA()
  4952.                                =========
  4953.  
  4954.      Function:       VIISCGA() --> logical
  4955.  
  4956.      Synopsis:       Checks if active Display is in CGA mode.
  4957.  
  4958.  
  4959.      Returns:        .T. active Display Adapter is in CGA mode;
  4960.                      otherwise .F.
  4961.  
  4962.                           VIISEGA()
  4963.                           =========
  4964.  
  4965.      Function:       VIISEGA() --> logical
  4966.  
  4967.      Synopsis:       Checks if active Display is in EGA mode.
  4968.  
  4969.  
  4970.      Returns:        .T. active Display Adapter is in EGA mode;
  4971.                      otherwise .F.
  4972.  
  4973.                                VIISHERC()
  4974.                                ==========
  4975.  
  4976.      Function:       VIISHERC() --> logical
  4977.  
  4978.      Synopsis:       Checks if active Display is in HERCULES mode.
  4979.  
  4980.  
  4981.      Returns:        .T. active Display Adapter is in HERCULES mode
  4982.                      otherwise .F.
  4983.  
  4984.                                VIISMCGA()
  4985.                                ==========
  4986.  
  4987.      Function:       VIISMCGA() --> logical
  4988.  
  4989.      Synopsis:       Checks if active Display is in MCGA mode.
  4990.  
  4991.  
  4992.      Returns:        .T. active Display Adapter is in MCGA mode
  4993.                      otherwise .F.
  4994.  
  4995.                                VIISMDA()
  4996.                                =========
  4997.  
  4998.      Function:       VIISMDA() --> logical
  4999.  
  5000.      Synopsis:       Checks if active Display is in MDA mode
  5001.  
  5002.  
  5003.      Returns:        .T. active Display Adapter is in MDA mode
  5004.                      otherwise .F.
  5005.  
  5006.                                VIISVGA()
  5007.                                =========
  5008.  
  5009.      Function:       VIISVGA() --> logical
  5010.  
  5011.      Synopsis:       Checks if active Display is in VGA mode
  5012.  
  5013.  
  5014.      Returns:        .T. active Display Adapter is in VGA mode
  5015.                      otherwise .F.
  5016.  
  5017.                            VIPRNT()
  5018.                            ========
  5019.  
  5020.      Function:       VIPRNT(<expN1>,<expN2>,<expC1>,<expN3>) --> NIL
  5021.  
  5022.      Synopsis:       Write string to row/col with attribute
  5023.  
  5024.                      <expN1> - row
  5025.                      <expN2> - col
  5026.                      <expC1> - String to write
  5027.                      <expN3> - color attribute of string
  5028.  
  5029.                      The functions writes the string direct to VIDEO
  5030.                      MEMORY and is thus VERY FAST!!! However it doesn't
  5031.                      work in all modes (some graphics modes ). It works
  5032.                      with all video modes using either B000h or B800h
  5033.                      as base address ( e.g. EGA, VGA etc. )
  5034.  
  5035.      Examples:       ViPrnt(10,10,"Hello World",23)
  5036.  
  5037.      Notes:          Does not change cursor location or color setting.
  5038.  
  5039.      Returns:        nothing.
  5040.  
  5041.  
  5042.                               VISETMODE()
  5043.                               ===========
  5044.  
  5045.      Function:       VISETMODE( <expC1> ) --> logical
  5046.  
  5047.      Synopsis:       Sets a video card to specified Mode
  5048.  
  5049.                      <expC1>    numeric value (in HEXADECIMAL
  5050.                                 notation) representing Mode to set
  5051.                                 Video card to
  5052.  
  5053.                      This function is an all around video set function.
  5054.                      It can set a videocard to ANY mode provided it
  5055.                      supports it. If You use this function, first of
  5056.                      all make sure that Your MONITOR supports the new
  5057.                      resolution as some are so high in their display
  5058.                      resolution that they may damage Your monitor if
  5059.                      they are not supported. 
  5060.  
  5061.                      PLEASE REFER TO YOUR MONITOR AND VIDEO CARD MANUAL
  5062.                      FOR FURTHER INFORMATION IF BOTH SUPPORT THE TYPE
  5063.                      OF DISPLAY MODE YOU DESIRE TO SELECT!!!
  5064.  
  5065.                      Watch out for the resolutions only supported by
  5066.                      MULTISYNC or MULTIFREQUENCY monitors ( they are
  5067.                      generally the high HEX numbers > 20 )
  5068.  
  5069.                      However take care in selecting a mode that works
  5070.                      fine with Your system.
  5071.  
  5072.      Examples:       VISETMODE( "7" )       && sets VGA videocard to
  5073.                                             && mode 07h
  5074.  
  5075.                      VISETMODE( "29" )      && sets VGA card with
  5076.                                             && ET4000
  5077.                                             && into 800x600 graphics mode
  5078.  
  5079.                      VISETMODE( "53" )      && sets VGA card with
  5080.                                             && TVGA 8900
  5081.                                             && into 132x25 textmode
  5082.  
  5083.  
  5084.      Returns:        .T. if called successfully, otherwise .F.
  5085.  
  5086.  
  5087.                               VISLIDEOFF()
  5088.                               ============
  5089.  
  5090.      Function:       VISLIDEOFF( ) --> NIL
  5091.  
  5092.      Synopsis:       Slides a screen variable off the screen
  5093.  
  5094.                      <expN1> .. <expN4> Screen coordinates to slide off
  5095.  
  5096.                      <expC1>  variable containing the saved screen
  5097.  
  5098.                      <expN5>  speed of slide..........>
  5099.  
  5100.                      The function will slide a saved screen area off
  5101.                      the screen. Use a function that saves the screen
  5102.                      area first. Then use the slider....
  5103.  
  5104.      Returns:        Nothing
  5105.  
  5106.